采用成员函数和 return 静态 lambda/std:: 函数的 C++ 函数

C++ function that take a member function and return a static lambda/std::function to it

我想实现一个成员函数,该函数采用指向其他成员函数的指针和 return 静态绑定。可以是任何东西: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;
}

特化 std::function<T> 仅在 T 是函数类型时定义。没有 std::function<T> 其中 T 是指向成员函数类型的指针。无论如何,如果您只想将指针传递给成员函数,那么为参数构造一个 std::function 是没有意义的。您可以像这样直接这样做:

auto link(void (MyClass::*func)(int))->std::function<void(int)>

必须使用 .*->* 运算符以及适当的 class 表达式或指向 class 类型(分别)的指针来调用指向成员函数的指针左边。因此在这种情况下你可以这样写:

return [this, func](int i){(this->*func)(i);};

您可以根据需要使用 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);
}

要以其他答案为基础,您可以将其概括为任何成员函数指针,如下所示:

template <typename Ret, typename... Args>
auto link( Ret(MyClass::*func)(Args...))->std::function<Ret(Args...)>
{
    return [this, func](Args... args){ return (this->*func)(args...);};
}