Учитывая следующее, Что такое "функция"?
Учитывая следующее, Что такое "функция"?
#include <functional>
#include <vector>
template<class T>
class Foo
{
public:
template<typename P, typename Q, typename R, typename... Args>
void Attach(P (Q::*f)(Args...), R p)
{
auto function = [p, f](Args... args)
{
(*p.*f)(args...);
};
Listeners.push_back(function);
}
private:
std::vector<std::function<T>> Listeners;
};
class Bar
{
public:
int Handler(int x, int y, int z)
{
return 0;
}
};
int main(void)
{
auto foo = Foo<int(int, int, int)>();
auto bar = Bar();
foo.Attach(&Bar::Handler, &bar);
}
Для некоторого контекста я пытаюсь создать лямбду, которая вызывает метод на экземпляре, сохраняя эту лямбду в коллекцию. Мой push_back не удалось скомпилировать, со следующей ошибкой:
Xrefwrap (283): ошибка C2440: 'return': не удается преобразовать из 'void' в 'int'
Изначально я использовал std:: bind для создания функции std::, которую я мог бы хранить. По-видимому, я могу сделать это с помощью лямбды (и вариадические шаблоны, так что мне не нужен один шаблон на arity), но пока это побеждает меня.
1 ответ:
Когда вы построили
Foo
, предоставленный явный аргумент шаблона являетсяauto foo = Foo<int(int, int, int)>();
,int main(void) { auto foo = Foo<int(int, int, int)>(); //<<<< Here is the template arguments when constructing Foo auto bar = Bar(); foo.Attach(&Bar::Handler, &bar); }
Где, как и при регистрации прослушивателя, тип возврата сигнатур функции void
auto function = [p, f](Args... args) { (*p.*f)(args...); };
Разрешение
Так что либо вы
- изменить явного аргумента шаблона Фу,
auto foo = Foo<void(int, int, int)>();
, чтобы возвращать Void, чтобы соответствовать ваш слушатель обратного вызова.- или убедитесь, что функция listener возвращает целое число.
return (*p.*f)(args...);
Примечание может быть вы намеревались вернуть код состояния от прослушивателя, но вы могли пропустить? Таким образом, второй пункт резолюции выглядит для меня очевидным правдоподобным вопросом