【发布时间】:2020-10-26 21:09:08
【问题描述】:
我正在尝试编写一个接受成员函数指针作为参数的模板化方法。
这是一个示例类,包括我最近尝试编写的模板方法:
class MyClass
{
public:
int myMethod() { return 1; }
template<typename T>
T call(std::function<T(MyClass*)> m)
{
return m(this);
}
};
我的目标是能够做到以下几点(或语法上非常相似的事情):
MyClass m;
auto result = m.call(&MyClass::myMethod);
到目前为止,我的上述尝试,我可以做到:
MyClass m;
std::function<int(MyClass*)> f = &MyClass::myMethod;
auto result = m.call(f);
我很惊讶我什至无法将其包装成一行。 m.call(&MyClass::myMethod) 这不会编译。为什么?
我确信有办法获得我想要的行为,所以任何帮助将不胜感激!
【问题讨论】:
-
运行代码时得到什么输出?
-
关于推断
T的类型我想。这显式指定T,编译auto result = m.call<int>([](MyClass* h){return h->myMethod();}); -
当我用我想要的语法编译时,我得到
candidate template ignored: could not match 'function<type-parameter-0-0 (MyClass *)>' against 'int (MyClass::*)()'我试图避免指定返回类型等,希望尽可能自动。从技术上讲,我可以做到这一点,但它的语法很糟糕:m.call(std::function<std::result_of<decltype(&MyClass::myMethod)(MyClass)>::type(MyClass*)>(&MyClass::myMethod)) -
为什么在成员函数模板调用中调用“m”时将“this”作为参数传递。一世。 e m(这个) ;
标签: c++ c++11 templates lambda std-function