如何获取与某个谓词匹配的类型的索引
How do I get the index of a type matching some predicate?
我有一个类型的可变列表,我想找到第一个基类型为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
演示
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配
- 模板类型推断失败(std::空作为谓词)
- <未解析的重载函数类型>调用二进制谓词
- 如何对具有带符号数字类型的事物进行谓词
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- 如何获取与某个谓词匹配的类型的索引
- 使用类型谓词执行重载解析
- 为什么std::copy_if签名不约束谓词类型
- C ++在我的类中condition_variable wait_for谓词,std::thread<未解析的重载函数类型>错误
- C++编译时谓词,用于测试是否可以使用 T 类型的参数调用 F 类型的可调用对象