Учитывая следующее, Что такое "функция"?


Учитывая следующее, Что такое "функция"?

#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 3

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...);

Примечание может быть вы намеревались вернуть код состояния от прослушивателя, но вы могли пропустить? Таким образом, второй пункт резолюции выглядит для меня очевидным правдоподобным вопросом