使用'这个'指针在std :: function原型中

时间:2018-03-22 06:15:39

标签: c++ c++11 templates

据我所知,成员函数与普通函数不同,因为还有一个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
}

1 个答案:

答案 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中并免费获取它可以说。