c++ - 如何静态断言元组的所有类型是否满足某些条件?

标签 c++ tuples c++14 typetraits

我有一些类型特征 SomeTraits我可以从中提取类型 T满足一些条件,通过 SomeTraits<T>::value . 如何遍历给定 std::tuple<> 的所有类型并检查(通过静态断言)它们是否都满足上述条件?例如

using MyTypes = std::tuple<T1, T2, T3>;
// Need some way to do something like
static_assert(SomeTupleTraits<MyTypes>::value, "MyTypes must be a tuple that blabla...");

哪里SomeTupleTraits会检查是否 SomeTraits<T>::value == true对于内部的每种类型 MyTypes

我仅限于 C++14。

最佳答案

作为单行(换行可选),你可以这样做:

// (c++20)
static_assert([]<typename... T>(std::type_identity<std::tuple<T...>>) {
    return (SomeTrait<T>::value && ...);
}(std::type_identity<MyTypes>{}));

或者你可以创建一个辅助特征来做到这一点:

// (c++17)
template<template<typename, typename...> class Trait, typename Tuple>
struct all_of;

template<template<typename, typename...> class Trait, typename... Types>
struct all_of<Trait, std::tuple<Types...>> : std::conjunction<Trait<Types>...> {};

static_assert(all_of<SomeTrait, MyTypes>::value);

或者在 C++11 中,你可以重新实现 std::conjunction在 helper trait 中:

template<template<typename, typename...> class Trait, typename Tuple>
struct all_of;

template<template<typename, typename...> class Trait>
struct all_of<Trait, std::tuple<>> : std::true_type {};

template<template<typename, typename...> class Trait, typename First, typename... Rest>
struct all_of<Trait, std::tuple<First, Rest...>> :
    std::conditional<bool(Trait<First>::value),
                     all_of<Trait, std::tuple<Rest...>>,
                     std::false_type>::type::type {};

static_assert(all_of<SomeTrait, MyTypes>::value, "");

关于c++ - 如何静态断言元组的所有类型是否满足某些条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72293711/

相关文章:

c++ - 数组中不同数量的字符串

c++ - Cuda 以原子方式执行操作

c++ - 函数和指针帮助 : Program builds but Crashes without any specific errors

c++ - qInitResources() 上的 Qt 链接器错误 LNK2019 - RCC

python - 根据条件将数据帧转换为元组列表

c++ - 使用参数推导时如何停止模板递归?

python - 如何绘制二维直方图?

python - 为什么我的 numpy 构造忽略元组解构?

c++ - 消除相似函数定义的重复代码

带有嵌套对象优化的 c++ emplace_back