我想制作一个具有N个参数的可变参数模板,其中N也是模板参数。例如,
template <int N, typename T[N]>
void function(T t[N]) {
// do stuff with t[0] through t[N-1]
}
(我意识到上面的语法无效)
我知道实现此目的的一种方法是在static_assert
上使用sizeof...(ArgsT)
,其中ArgsT
是可变参数模板定义(即template <typename ...ArgsT>
)。
我只是想知道是否有更好的方式,不一定涉及static_assert
。
答案 0 :(得分:7)
您可以使用std::enable_if
代替static_assert
:
template <std::size_t N, typename ...Args>
auto function(Args&&... args)
-> typename std::enable_if<N == sizeof...(Args), void>::type
{
...
}
更新:它也可以在构造函数中使用它,其中N
是类的模板参数。
template <std::size_t N>
struct foobar
{
template <typename ...Args, typename = typename std::enable_if<N == sizeof...(Args), void>::type>
foobar(Args&&... args) { ... }
};