2012-03-07 3 views
2

У меня есть stl::list кортежей, которые я хочу найти для элемента, используя std::find_if, используя несколько типов сравнения в каждом. Можно ли связать тип кортежа с определенной шаблонной функцией 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); 
    } 
}; 

То, что я хочу, как obj_predicate<int>(3) осведомленный о положении int в кортеже.

+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