我希望我的模板类不允许使用非标量类型的数组作为模板参数,为此我编写了这些辅助类型:
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。
答案 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()
替换它。否则一切都很好。