采用成员函数和 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...);};
}
我想实现一个成员函数,该函数采用指向其他成员函数的指针和 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...);};
}