强制 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 {};

live example.

这里我们做一个边界 I.

的 SFINAE 测试