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 では、ラムダを使用します。

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

(そして、おそらくC++11を好むでしょうstd::function) 。boost::function

于 2013-08-01T15:59:27.587 に答える