C ++ Найти элемент в списке кортежей, используя предикат - PullRequest
2 голосов
/ 07 марта 2012

У меня есть stl::list кортежей, которые я хочу найти для элемента, используя std::find_if, используя сравнение нескольких типов в каждом.Могу ли я связать тип кортежа с определенной шаблонной функцией get()?Поэтому не нужно будет передавать номер поля в шаблон предиката.

Я создал предикат, подобный этому:

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 в кортеже.

1 Ответ

3 голосов
/ 07 марта 2012

Мы могли бы использовать «петлю».Это вернет индекс last , соответствующий элементу с данным типом.

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 };
};

Пример:

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
...