Вызов функции из std::function

268
09 ноября 2017, 06:15

Есть примитивный класс:

class type
{
   public:
int print(int i) { std::cout << i << std::endl; return i * i; }
void test()
{
    std::function<int(int)> func(std::bind(&type::print, this, 489));
    func(); // как вызвать функцию, ведь в конструкторе я уже передал ей аргумент 489?
}
};

Собственно, хотелось бы узнать.

Answer 1

Должно быть

std::function<int()> func(std::bind(&type::print, this, 489));
func();

Так как оба параметра вашей функции вы уже "связали", свободных параметров больше нет и внешний интерфейс вашего функтора - int(), а не int(int).

Конструктор std::function не контролирует соответствие интерфейса вызова между тем типом, который вы указали в <...>, и тем функтором, который вы передали в качестве параметра. Соответствие ищется только в момент самого вызова. Поэтому в вашем варианте вы и получаете ошибку именно на строчку func();, а не при инициализации func.

Более того, в вашем исходном варианте вы можете вызвать ваш func, как

func(42);

и все прекрасно скомпилируется. Функциональный объект, создаваемый std::bind не против того, чтобы ему передавали лишние аргументы - он их просто игнорирует.

READ ALSO
Методы уже определены в *.obj

Методы уже определены в *.obj

Добрый день, первый раз столкнулся с такой проблемойПри компиляции вылазит следующее для каждого метода:

272
Помогите с решением [требует правки]

Помогите с решением [требует правки]

Написать перегруженную функцию для сложения: десятичных дробей и обыкновенных дробей (дробь задана числителем и знаменателем)Как вычислить...

251
Событие полностью введенной даты

Событие полностью введенной даты

Вообщем необходимо после введения даты менять минимальное времяЕсть input с типом date, мне нужно отследить события полного ввода этого поля,...

251