给定以下内容,"function"是什么类型?



给定以下内容,"函数"是什么类型?

#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);
}

对于某些上下文,我正在尝试创建一个在实例上调用方法的 lambda,将该 lambda 存储到集合中。 我的push_back无法编译,出现以下错误:

外部参照包装(283): 错误 C2440: 返回" : 无法从 "void" 转换为 "int"

我最初使用 std::

bind 来制作一个我可以存储的 std::函数。 显然,我可以使用lambda(和可变参数模板,所以我不需要每个arity一个模板)来做到这一点,但到目前为止,它正在击败我。

当你构造了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...);
    };

分辨率

所以要么你

  • 更改 Foo 的显式模板参数,auto foo = Foo<void(int, int, int)>();返回 void 以匹配侦听器回调。
  • 或者确保侦听器函数返回整数。 return (*p.*f)(args...);

注意:您可能打算从侦听器返回状态代码,但您可能错过了?所以第二个解决点在我看来是一个明显的合理问题

最新更新