gpt4 book ai didi

c++ - 检查数组是否为标量类型

转载 作者:行者123 更新时间:2023-11-30 02:34:49 27 4
gpt4 key购买 nike

我希望我的模板类不允许非标量类型的数组作为模板参数,为此我编写了这些辅助类型:

template<bool> struct AssertTrue;

template<> struct AssertTrue<true> {};

template < class T>
struct FilterOutArraysWithNonScalarTypes
{
typedef std::true_type Allowed;
};

template < class T, size_t N>
struct FilterOutArraysWithNonScalarTypes<T[N]>
{
typedef std::integral_constant<bool, std::is_scalar<T>::value> Allowed;
};

然后在我对象的构造函数中我这样检查

CheckAllowance<FilterOutArraysWithNonScalarTypes<T>::Allowed::value>;

我能做得更好吗?

编辑:

抱歉,我用 CheckAllowance 打印错了 AssertTrue。

最佳答案

您可以使用单个 static_assert 执行此操作:

template <typename T>
struct Foo {
static_assert(!(std::is_array<T>::value &&
!std::is_scalar<std::remove_extent_t<T>>::value),
"Must not be a non-scalar array");
};

如果你觉得这太冗长,你可以制作一个别名模板特征:

template <typename T>
using is_non_scalar_array = std::integral_constant<
bool,
std::is_array<T>::value &&
!std::is_scalar<std::remove_extent_t<T>>::value
>;

或者作为变量模板:

template <typename T>
constexpr bool is_non_scalar_array = std::is_array<T>::value &&
!std::is_scalar<std::remove_extent_t<T>>::value;

关于c++ - 检查数组是否为标量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34292795/

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