使用谓词在元组列表中查找元素的C++代码

3

我有一个包含元组的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 的位置的功能。


不是很确定,但如果您知道解决方案,为什么不呢? - aambrozkiewicz
你对当前的实现有什么不喜欢的地方吗? - Mark B
我有一个工厂,可以通过不同类型的值创建实例。这种设计要求我重载createInstance方法,并使用不同的字段编号和值调用find_if(当然可以在createInstance中使用模板typename声明)。 - aambrozkiewicz
1个回答

4

我们可以使用“循环”。这将返回与给定类型匹配的元素的最后索引。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接