给定以下内容,"function" 是什么类型?
Given the following, what type is "function"?
鉴于以下情况,"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 编译失败,出现以下错误:
xrefwrap(283): error C2440: 'return' : cannot convert from 'void' to
'int'
我最初是用 std::bind 制作一个 std::function 可以存储的。显然我可以用 lambda(和可变参数模板,所以我不需要每个参数一个模板)但到目前为止它打败了我。
当您构造 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);
}
当您注册侦听器时,函数签名 return 类型为 void
auto function = [p, f](Args... args)
{
(*p.*f)(args...);
};
分辨率
所以要么你
- 将 Foo 的显式模板参数
auto foo = Foo<void(int, int, int)>();
更改为 return void 以匹配您的侦听器回调。
- 或确保您的侦听器函数 return 是一个整数。
return (*p.*f)(args...);
注意 可能您打算 return 来自侦听器的状态代码,但您可能错过了?所以第二个解决点在我看来是一个明显合理的问题
鉴于以下情况,"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 编译失败,出现以下错误:
xrefwrap(283): error C2440: 'return' : cannot convert from 'void' to 'int'
我最初是用 std::bind 制作一个 std::function 可以存储的。显然我可以用 lambda(和可变参数模板,所以我不需要每个参数一个模板)但到目前为止它打败了我。
当您构造 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);
}
当您注册侦听器时,函数签名 return 类型为 void
auto function = [p, f](Args... args)
{
(*p.*f)(args...);
};
分辨率
所以要么你
- 将 Foo 的显式模板参数
auto foo = Foo<void(int, int, int)>();
更改为 return void 以匹配您的侦听器回调。 - 或确保您的侦听器函数 return 是一个整数。
return (*p.*f)(args...);
注意 可能您打算 return 来自侦听器的状态代码,但您可能错过了?所以第二个解决点在我看来是一个明显合理的问题