1

如何实现以下重载方法调用

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)));

然后我找到了一个可能的答案,所以尝试了这个:-

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 编译得很好

4

1 回答 1

2

您链接到的可能答案是解决一个不同的问题:在获取指向该函数的指针时在函数重载之间进行选择。解决方案是显式转换为正确的函数类型,因为只有正确的函数才能转换为该类型。

您的问题有所不同:在调用函数时在重载之间进行选择,当没有明确转换为任何重载参数类型时。您可以显式转换为函数类型:

f.bind(1,boost::function<int (void)>(boost::bind(&SomeClass::getint,boost::ref(c))));

或者,在 C++11 中,使用 lambda:

f.bind(1,[&]{return c.getint();});

(你可能更喜欢std::functionboost::functionC++11 中)。

于 2013-08-01T15:59:27.587 回答