2012-04-23 11 views
0
template <class T> struct greater : binary_function <T,T,bool> { 
    bool operator() (const T& x, const T& y) const 
    {return x>y;} 
}; 

template <class T> struct logical_and : binary_function <T,T,bool> { 
    bool operator() (const T& x, const T& y) const 
    {return x&&y;} 
}; 

// (i > 5 && i <=10) 
countBoost = std::count_if(vecInts.begin(), vecInts.end(), 
          boost::bind(std::logical_and<bool>(), 
                 ^^^^ // ???? Why ???? 
            boost::bind(std::greater<int>(), _1, 5), 
            boost::bind(std::less_equal<int>(), _1, 10)) 
         ); 

less_equal` `のstd :: greater`または`のstd ::の種類が何であるか、パスを入力Tstd::logical_and<T>ためには、機能operator()のパスのパラメータのタイプです。上記のコードが与えられた場合、std::greaterのタイプはboolであり、返される値はoperator()です。は私の理解に基づいて

これは間違いありませんか?

はブーストバインダーは、あなたが期待するかもしれないものよりも少し魔法を行い、あなたに

答えて

1

ありがとうございます。バインドされた引数の1つがバインド式である場合、という式を呼び出し中に実行し、その結果を使用します。この場合、内部バインドされた式は、とstd::greater<int>の両方の呼び出しであり、いずれもboolとなり、次にstd::logical_and<bool>に渡されます。

2

operator()関数の戻り値の型はboolです。 std::greaterのタイプはstd::greaterです。それは機能的なオブジェクトです。したがって: 例えば、VC++用"struct std::greater<int>"

std::greater<int> g; 
std::cout << typeof(g).name() << std::endl; 

は、コンパイラがクラステンプレートのインスタンス化 種類を表示するために使用するものは何でも戻ります。

関連する問題