我有一个可变的类型列表,我想找到第一种类型的索引,它具有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
是其参数,元组是要检查的元素。
答案 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