goo*_*ons 0 c++ pointers member-function-pointers function-pointers functor
我不确定这在C++中是否可行.我知道你可以将指向函数或静态成员函数的指针作为参数传递.我想要一个特定对象的函数指针,这样当函数执行时,它就在对象上完成.
class MyClass
{
public:
MyClass(int id){mId = id;}
void execute(){cout<<mId<<endl;}
private:
int mId;
};
MyClass obj1(1);
MyClass obj2(2);
typedef (Executor)();
Executor ex1 = &obj1::execute();
Executor ex2 = &obj2::execute();
Run Code Online (Sandbox Code Playgroud)
因此,当执行ex1时,应打印"1",如果执行ex2,则打印"2".这可能吗?
处理此问题的工具是功能模板bind:
auto ex1 = std::bind(&MyClass::execute, obj1);
Run Code Online (Sandbox Code Playgroud)
您可以在function对象中存储绑定:
std::function<void()> ex1 = std::bind(&MyClass::execute, obj1);
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下bind将按obj值存储; 你可以存储一个引用ref:
std::function<void()> ex1 = std::bind(&MyClass::execute, std::ref(obj1));
Run Code Online (Sandbox Code Playgroud)
一个相关的工具是mem_fn,它包装了一个成员函数指针:
void (MyClass::*ex1)() = &MyClass::execute; // raw member function pointer
ex1(obj1);
auto ex1 = std::mem_fn(&MyClass::execute); // mem_fn wrapper
ex1(obj)
Run Code Online (Sandbox Code Playgroud)
但是,因为mem_fn不绑定实例,所以每次调用它时都必须提供实例.
为了避免在绑定成员函数时编写类名,可以使用宏:
#define BIND_MEM_FN(o,m) \
std::bind(&std::remove_reference<decltype(o)>::type::m, (o))
Run Code Online (Sandbox Code Playgroud)
宏是必需的,因为您只能从其类型和名称形成成员函数指针,并且您不能将名称(非限定ID)传递给函数.
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |