强制 static_assert 在类型实例化期间触发
Force static_assert to fire during type instantiating
如何在给定的 class:
中强制 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
}
一条建议
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
{
};
可能有更优雅的方法,但您可以使 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
}
为了尽可能降低对现有代码的影响,您可以使用模板别名:
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>
的代码使用不同的语法来引用模板。
template < int I, class=std::enable_if_t< (I<5) > >
struct foo {};
这里我们做一个边界 I
.
的 SFINAE 测试
如何在给定的 class:
中强制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
}
一条建议
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
{
};
可能有更优雅的方法,但您可以使 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
}
为了尽可能降低对现有代码的影响,您可以使用模板别名:
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>
的代码使用不同的语法来引用模板。
template < int I, class=std::enable_if_t< (I<5) > >
struct foo {};
这里我们做一个边界 I
.