我想实现一个成员函数,该函数接受指向其他成员函数的指针并返回静态绑定。可以是任何:lambda
或? std::function
。
从那时起,我在C ++ 11中做了以下意图但没有成功:
#include <functional>
#include <iostream>
class MyClass{
public:
auto link( std::function<void(MyClass::*)(int)> func)->std::function<void(int)>
{
return [this, func](int i){func(i);};
}
auto myFunc(int i)->void { std::cout << "Ok:" << i << std::endl; }
auto test ()->void
{
link(&MyClass::myFunc)(4);
}
};
auto main()->int
{
MyClass c;
return 0;
}
答案 0 :(得分:5)
仅在std::function<T>
是函数类型时才定义专门化T
。没有std::function<T>
其中T
是指向成员函数类型的指针。无论如何,如果你只想传递指向成员函数的指针,那么为参数构造std::function
是没有意义的。您可以直接这样做:
auto link(void (MyClass::*func)(int))->std::function<void(int)>
必须使用.*
或->*
运算符调用指向成员函数的指针,并在左侧使用适当类的表达式或指向类类型的指针(分别)。因此,在这种情况下,您可以写:
return [this, func](int i){(this->*func)(i);};
答案 1 :(得分:1)
您可以使用std::bind
使用指向成员的指针或std::function
按照您的意愿实现此目的:
auto link_pointer_to_member(void(MyClass::*func)(int))->std::function<void(int)>
{
return std::bind(func, this, std::placeholders::_1);
}
auto link_function( std::function<void(MyClass*, int)> func)->std::function<void(int)>
{
return std::bind(func, this, std::placeholders::_1);
}
答案 2 :(得分:1)
要构建其他答案,您可以对任何成员函数指针进行概括,如下所示:
template <typename Ret, typename... Args>
auto link( Ret(MyClass::*func)(Args...))->std::function<Ret(Args...)>
{
return [this, func](Args... args){ return (this->*func)(args...);};
}