如何在这个给定的类中强制static_assert
:
template < int I >
struct foo
{
static_assert( I < 5 ,"I must be smaller than 5!" );
};
在我实例化结果类型时实例化模板no时触发:
int main()
{
typedef foo< 5 > t; // compiles
t tt; // will not compile
}
答案 0 :(得分:4)
一个建议
template <int I>
struct foo_guard {
static_assert(I < 5, "I must be smaller than 5!");
typedef void type;
};
template < int I, typename = typename foo_guard<I>::type>
struct foo
{
};
答案 1 :(得分:4)
可能有一种更优雅的方式,但你可以使foo
成为一个引用自身的元函数:
template < int I >
struct foo
{
static_assert( I < 5 ,"I must be smaller than 5!" );
typedef foo<I> type;
};
int main()
{
typedef typename foo< 5 >::type t; // won't compile
}
答案 2 :(得分:3)
为了尽可能降低对现有代码的影响,您可以使用模板别名:
template <int I>
struct foo_impl
{
static_assert(I < 5 ,"I must be smaller than 5!");
};
template <int I, int = sizeof(foo_impl<I>)>
using foo = foo_impl<I>;
int main()
{
typedef foo<5> t;
}
这允许静态断言与实现的其余部分保持一致,但不要求使用foo<N>
的代码使用不同的语法来引用模板。
答案 3 :(得分:1)
template < int I, class=std::enable_if_t< (I<5) > >
struct foo {};
在这里,我们进行了一个限制I
的SFINAE测试。