2

以下に示すこれらの関数テンプレートを作成したかったのです。それらの目的はファンクターを比較することですが、boost.bindタイプのファンクターの特殊なケースをカバーする必要がありました。

template<typename R, typename F, typename L>
void compare(boost::_bi::bind_t<R, F, L>& lhs, boost::_bi::bind_t<R, F, L>& rhs)
{
    std::cout << lhs.compare(rhs) << std::endl;
}

template<typename T>
void compare(T lhs, T rhs)
{
    std::cout << (lhs == rhs) << std::endl;
}

問題は、私がそうするときcompare(boost::bind(func, 1), boost::bind(func, 1))、コンパイラが2番目のテンプレートを使おうとすることです。2つ目をコメントアウトすると、boost.bindタイプに特化したものが正しく使用され、すべてが正常に機能します。

使用する正しい関数テンプレートを選択するにはどうすればよいですか?

4

1 に答える 1

1

boost::bindconst非参照にバインドできない値を返します。より特殊なテンプレートは、値または参照によって引数を取る必要があります。constそうしないと、呼び出しで考慮されませんcompare( boost::bind(func, 1), boost::bind(func, 1) )

このテストプログラムはコンパイルされ、私のプラットフォームで正しく動作します。

#include <boost/bind/bind.hpp>
#include <iostream>
#include <ostream>

template<typename R, typename F, typename L>
void compare(const boost::_bi::bind_t<R, F, L>& lhs
                 , const boost::_bi::bind_t<R, F, L>& rhs)
{
    std::cout << lhs.compare(rhs) << std::endl;
}

template<typename T>
void compare(T lhs, T rhs)
{
    std::cout << (lhs == rhs) << std::endl;
}

void func(int) {}

int main()
{
    compare( boost::bind(func, 1), boost::bind(func, 1) );
}
于 2011-07-31T06:46:09.407 に答える