如何实现以下重载方法调用
class Foo {
void bind(const int,boost::function<int (void)> f);
void bind(const int,boost::function<std::string (void)> f);
void bind(const int,boost::function<double (void)> f);
};
首次尝试
SomeClass c;
Foo f;
f.bind(1,boost::bind(&SomeClass::getint,ref(c));
f.bind(1,boost::bind(&SomeClass::getstring,ref(c)));
f.bind(1,boost::bind(&SomeClass::getdouble,ref(c)));
然后我找到了possible answer,所以尝试了这个: -
f.bind(static_cast<void (Foo::*)(int,boost::function<int(void)>)>(1,boost::bind(&SomeClass::getint)));
看起来很难看但可能会有效吗?
但是给出了错误
error C2440: 'static_cast' : cannot convert from 'boost::_bi::bind_t<R,F,L>' to 'void (__cdecl Foo::* )(int,boost::function<Signature>)'
我可以使这个重载工作的任何想法。我怀疑类型擦除正在发生,但编译器显然识别出重载的方法,因为Foo.cpp编译良好 p>
答案 0 :(得分:2)
您链接的可能答案是解决另一个问题:在获取指向该函数的指针时选择函数重载。解决方案是显式转换为正确的函数类型,因为只有正确的函数可以转换为该类型。
您的问题不同:在调用函数时选择重载,当没有明确转换为任何重载参数类型时。您可以显式转换为函数类型:
f.bind(1,boost::function<int (void)>(boost::bind(&SomeClass::getint,boost::ref(c))));
或者,在C ++ 11中,使用lambda:
f.bind(1,[&]{return c.getint();});
(在C ++ 11中你可能更喜欢std::function
到boost::function
。