2012-03-07 8 views
2

std::find_ifを使用して要素を検索したいタプルのstl::listをそれぞれ複数の型比較で使用しています。タプルタイプを特定のテンプレート付きget()関数に関連付けることはできますか?したがって、フィールド番号を述語テンプレートに渡す必要はありません。C++述語を使用してタプルのリスト内の要素を検索

私はこのような述語作成:私が欲しいもの

template<typename T, size_t field> 
struct obj_predicate : public std::unary_function<ObjectRecordType, bool> 
{ 
    const T* comparisonObject; 
    obj_predicate(const T& cObj) : comparisonObject(&cObj) {} 
    bool operator()(const ObjectRecordType& obj) const 
    { 
     return *comparisonObject == std::tr1::get<field>(obj); 
    } 
}; 

はタプルのintの位置を認識してobj_predicate<int>(3)のようなものです。

+0

あなたはC++ 11を使用することはできますか? – kennytm

+0

あなたが解決策を知っているのであれば、本当にそうではありません。 – aambrozkiewicz

+0

現在の実装について気に入っていないものは何ですか? –

答えて

3

"ループ"を使用できます。指定された型の要素に一致する最後のインデックスが返されます。

template <typename T, typename S, int i = std::tr1::tuple_size<T>::value - 1> 
struct tuple_index 
{ 
    enum 
    { 
     value = std::tr1::is_same<typename std::tr1::tuple_element<i, T>::type, S>::value ? 
      i : 
      tuple_index<T, S, i-1>::value 
    }; 
}; 

template <typename T, typename S> 
struct tuple_index<T, S, -1> 
{ 
    enum { value = -1 }; 
}; 

Example:

printf("%d\n", tuple_index<std::tr1::tuple<int, double>, int>::value); // 0 
printf("%d\n", tuple_index<std::tr1::tuple<int, double>, double>::value); // 1 
printf("%d\n", tuple_index<std::tr1::tuple<int, double>, long>::value); // -1 
+0

私はそれを私の心に持っていましたが、私はメタプログラミングの知識が不足しています。とにかく、私はあなたを崇拝します。あなたの時間をありがとう。 – aambrozkiewicz

関連する問題