gpt4 book ai didi

c++ - 检查所有类型 T 的参数包

转载 作者:IT老高 更新时间:2023-10-28 23:15:34 25 4
gpt4 key购买 nike

Jonathan Wakely 的 answer问题 Type trait to check that all types in a parameter pack are copy constructible提供了一种简单(ish)的方法来检查参数包中扩展的所有变量是否属于同一类型 - 例如:

#include <type_traits>

namespace detail {
enum class enabler {};
}

template <bool Condition>
using EnableIf =
typename std::enable_if<Condition, detail::enabler>::type;

template<typename... Conds>
struct and_ : std::true_type {};

template<typename Cond, typename... Conds>
struct and_<Cond, Conds...>
: std::conditional<Cond::value, and_<Conds...>,
std::false_type>::type {};

template<typename... T>
using areInts = and_<std::is_same<T,int>...>;

template<typename... T>
using areMySpecificClass = and_<std::is_same<T,MySpecificClass>...>;

我不知道如何扩展它,例如编写像 areTypeT 这样的模板。

我的第一次尝试偶然发现“参数包'T'必须在模板参数列表的末尾”。我最近的尝试编译,但如果我使用它,我会得到替换失败:

template<typename Target>
template<typename... T1>
using areT = and_<std::is_same<T1,Target>...>;

我怎样才能做到这一点?

最佳答案

C++17 定义了 and_ 的版本调用std::conjunction<type_traits> 中定义来自标准库的头文件。

template <typename T, typename ...Ts>
using areT = std::conjunction<std::is_same<T,Ts>...>;

static_assert(areT<int,int,int,int>::value);

还有一个版本std::conjunction调用std::conjunction_v它提供了value其实例化的数据成员。你也可以定义一个 areT_v C++14 变量模板自己:

template <typename T, typename ...Ts>
inline constexpr bool areT_v = std::conjunction_v<std::is_same<T,Ts>...>;

static_assert( areT_v<int,int,int,int>);
static_assert(!areT_v<int,int,int,char>);

关于c++ - 检查所有类型 T 的参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31533469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com