在类型实例化期间强制static_assert触发

时间:2015-04-08 17:31:58

标签: c++ static-assert

如何在这个给定的类中强制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 
}

4 个答案:

答案 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 {};

live example

在这里,我们进行了一个限制I的SFINAE测试。