如何获得与某个谓词匹配的类型的索引?

时间:2014-11-11 00:07:30

标签: c++ c++11

我有一个可变的类型列表,我想找到第一种类型的索引,它具有Base类型的基础。如果找不到,则应返回-1。这就是我想要的方式:

typedef std::tuple<A, B, C> Tuple;

int idx = find_if<std::is_base_of, Base, Tuple>::value;

std::is_base_of是谓词,Base是其参数,元组是要检查的元素。

1 个答案:

答案 0 :(得分:4)

怎么样?
constexpr std::size_t npos = -1;

template <template <class T> class, typename, std::size_t pos = 0>
struct find_if;

template <template <class T> class Pred, typename T, std::size_t pos, typename... tail>
struct find_if<Pred, std::tuple<T, tail...>, pos> :
    std::conditional<Pred<T>::value,
                     std::integral_constant<std::size_t, pos>,
                     find_if<Pred, std::tuple<tail...>, pos+1>>::type {};

template <template <class T> class Pred>
struct find_if<Pred, std::tuple<>> : std::integral_constant<std::size_t, npos> {};

template <template <class, class> class T, class U>
struct bind
{
    template <class X>
    using first  = T<U, X>;
    template <class X>
    using second = T<X, U>;
};

像这样使用:

find_if<bind<std::is_base_of, Base>::first, Tuple>::value

Demo