Есть примитивный класс:
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?
}
};
Собственно, хотелось бы узнать.
Должно быть
std::function<int()> func(std::bind(&type::print, this, 489));
func();
Так как оба параметра вашей функции вы уже "связали", свободных параметров больше нет и внешний интерфейс вашего функтора - int(), а не int(int).
Конструктор std::function не контролирует соответствие интерфейса вызова между тем типом, который вы указали в <...>, и тем функтором, который вы передали в качестве параметра. Соответствие ищется только в момент самого вызова. Поэтому в вашем варианте вы и получаете ошибку именно на строчку func();, а не при инициализации func.
Более того, в вашем исходном варианте вы можете вызвать ваш func, как
func(42);
и все прекрасно скомпилируется. Функциональный объект, создаваемый std::bind не против того, чтобы ему передавали лишние аргументы - он их просто игнорирует.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости