2

boost::bind は、std::bind とは異なり、これらの関数のいずれかにパラメーターがない場合、オーバーロードされた関数で動作することに気付きました。私は正しいですか?これは文書化されていますか?

#include <boost/bind.hpp>

#include <functional>
#include <iostream>

void foo()
{
    std::cout << "::foo() \n";
}

void foo(int)
{
    std::cout << "::foo(int) \n";
}

int main()
{
    boost::bind(foo)(); // Ok
    boost::bind(foo, 0)(); // Ok

    // std::bind(foo)(); // Error
    // std::bind(foo, 0)(); // Error
}

#include <boost/bind.hpp>

#include <functional>
#include <iostream>

void foo(int)
{
    std::cout << "::foo(int) \n";
}

void foo(const std::string&)
{
    std::cout << "::foo(const std::string&) \n";
}

int main()
{
    // boost::bind(foo, 0)(); // Error
    // boost::bind(foo, "str")(); // Error

    // std::bind(foo, 0)(); // Error
    // std::bind(foo, "str")(); // Error
}
4

3 に答える 3

2

オーバーロードがリストされている「インターフェース」->「概要」部分の一部として多少文書化されています。ご覧のとおり、Boost は可変個引数テンプレートを使用しないため、これらのオーバーロードが指定された場合、明示的に次のようになります。

template<class R> unspecified-2 bind(R (*f) ());
template<class F, class A1> unspecified-3-1 bind(F f, A1 a1);
template<class R, class B1, class A1> unspecified-4 bind(R (*f) (B1), A1 a1);

コンパイラは、他のものよりも空の引数リストを持つオーバーロードされたバージョンを優先します。とはいえ、これは意図的なものではなかったと思います。

于 2013-10-07T06:30:32.437 に答える
1

最初のケースは、 MSVC10 で と の両方stdを使用して適切にコンパイルされますboost(MSVC10 は可変個引数テンプレートをサポートしていないため、std::bindと同様に実装されboost::bindます)。

bind2 番目のケースは、アリティが異なるオーバーロードを解決できますが、引数の型だけが異なるオーバーロードを解決できないため、コンパイルされません。

于 2013-10-07T10:37:56.350 に答える