检查数组是否为标量类型

时间:2015-12-15 15:15:56

标签: c++ arrays templates

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

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。

2 个答案:

答案 0 :(得分:2)

您可以使用一个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;

答案 1 :(得分:1)

您的AssertTrue未在您显示的代码中使用。我想你可以用static_assert()替换它。否则一切都很好。