说我有这3个不同的功能,我可能想指出:
float test1(int a, int b) {
return 7.0f;
}
struct TestClass {
float test2(int a, int b) {
return 5.0f;
}
};
struct TestClass2 {
float test3(int a, int b) {
return 3.0f;
}
};
注意所有三个都使用相同的参数并返回值。我想要抽象出它是否是一个成员函数以及它属于哪个类。我想要一个委托类型,它可以引用这3个函数中的任何一个,这取决于它的初始化方式。
这是我的第一次尝试:
typedef std::function<float(int, int)> MyDelegate; // is this right?
int main() {
TestClass obj;
TestClass2 obj2;
MyDelegate a = test1;
MyDelegate b = std::bind(std::mem_fn(&TestClass::test2), obj); // is this right?
MyDelegate c = std::bind(std::mem_fn(&TestClass2::test3), obj2); // is this right?
return 0;
}
我的想法是我也想在包装器中存储'this'指针。这样,它就像一个功能齐全的委托。例如,调用'b(x,y)'就像调用obj.test2(x, y)
一样。
我甚至无法编译,我可能还没有完全掌握这一点。我是这些库的新手,VS2012中的错误是灾难性的无益的。任何帮助将不胜感激。
答案 0 :(得分:10)
您需要告诉std::bind
如何处理其他功能参数。要将b(x, y)
委托x
和y
调用到两个原始函数参数,您需要使用std::placeholders
命名空间中的占位符:
std::bind(&TestClass::test2, obj, std::placeholders::_1, std::placeholders::_2);
并且也不需要std::mem_fn
(它可以工作),因为std::bind
已经正确处理成员函数(使隐式this
参数成为明确的第一个参数,如{{ 1}}确实)。
答案 1 :(得分:3)
您需要为std :: bind提供2个参数,或者提供占位符来提供它们 后:
std::function<float(int, int)> c = std::bind(&TestClass2::test3, obj2, 1, 2);
c(); //returns result
OR
std::function<float(int, int)> c = std::bind(&TestClass2::test3, obj2, std::placeholders::_1, std::placeholders::_2);
c(1, 2); //returns result
有关std :: bind的更多信息是here。
答案 2 :(得分:2)
使用visual C ++编译器(CTP 2012)我发现了他们如何使用std :: function并提供了我自己的解决方案来处理成员函数
用法如下: http://ideone.com/v5zfDn
class Window
{
public:
void Show( int number ) const
{
//...
}
void ShowDynamic( int number ) volatile
{
//...
}
};
void ShowWindows( int param )
{
//...
}
int main()
{
Window window;
typedef mezutils::Delegate< void( int ) > Notifier;
Notifier notifier;
notifier = &ShowWindows;
notifier( 0 );
notifier = Notifier( &window, &Window::Show );
notifier( 1 );
notifier = [](int x) { /*...*/ };
notifier( 2 );
void (*funpc)(int) = func;
notifier = funpc;
notifier( 3 );
notifier = [](int arg) { printf("asd %d\r\n",arg); };
notifier(4);
return 0;
}
委托类看起来像: http://ideone.com/DebQgR
当然它是一个有趣的原型,但我喜欢它,因为它很明显