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

How do I get the index of a type matching some predicate?

本文关键字:谓词 类型 索引 何获取 获取      更新时间:2023-10-16

我有一个类型的可变列表,我想找到第一个基类型为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是其自变量,元组是要检查的元素。

怎么样

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

演示