C ++函数,它接受一个成员函数并返回一个静态lambda / std :: function

时间:2015-04-20 07:38:59

标签: c++ c++11 lambda member

我想实现一个成员函数,该函数接受指向其他成员函数的指针并返回静态绑定。可以是任何: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;
}

3 个答案:

答案 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...);};
}