据我所知,成员函数与普通函数不同,因为还有一个this
指针参数。
所以我的想法是让我的一个类成为以下成员模板函数:
template <class T>
void ApplyFunction(function<void(vector<int>&, T)> fun, T val);
然后我将在我的一个类中使用它,如:
Thing.ApplyFunction(myMethod, this);
和Thing
将使用当前类实例中的myMethod
。
很多代码都是猜测,所以我想澄清一下这是否有用。也不确定它是哪个方向:
void ApplyFunction(function<void(vector<int>&, T)> fun, T val);
或
void ApplyFunction(T val, function<void(vector<int>&, T)> fun);
一个代码示例,描述了为什么我可能需要这样的东西:
void ClassA::callbackMethod(vector<int> &array)
{
//I can edit the array here
}
void ClassA::someMethod(void)
{
ClassB B;
B.ApplyFunction(callbackMethod, this);
//now whenever B wants to edit the array, it can by using callbackMethod
B.ComplicatedStuff(); // B uses the callbackMethod multiple times here
}
答案 0 :(得分:1)
在我看来,你只是计划调用一个方法,而你不需要存储可调用的方法。如果是这种情况,则不应使用std::function
,而只需将可调用作为模板参数。
template <class T>
void ApplyFunction(T&& func) {
func(/*pass in your vector here*/);
}
然后你可以通过传入lambda来从A
调用它。
void ClassA::someMethod(void)
{
ClassB B;
B.ApplyFunction([&](std::vector<int>& vec){
// do stuff with vec here
// or call a member function
callbackMethod(vec);
vec.push_back(2);
});
}
这样会更快,因为像这样传递模板参数几乎不会产生额外的费用。如果函数是内联函数,它可以像调用成员函数一样便宜。
std::function
是任何可调用的类型擦除包装器,带有开销,只有在需要存储可调用项以供以后使用时才使用它。
修改强>
如果您想存储该功能,则不需要模板,只需在std::function
中选择ApplyFunction
作为参数。
void ApplyFunction(std::function<void(std::vector<int>&)> func) {
//Store it, call it now or call it later.
m_func = func;
m_func(/*pass in your vector here*/);
}
用lambda相同的方式调用它。
在将成员函数绑定到实例时,使用像这样的lambda是首选方法。不要单独传递this
,而是将其包裹在lambda中并免费获取它可以说。