【问题标题】:Variadic templates with exactly n parameters具有恰好 n 个参数的可变参数模板
【发布时间】:2014-05-04 16:11:40
【问题描述】:

我想制作一个带有 N 个参数的可变参数模板,其中 N 也是一个模板参数。例如,

template <int N, typename T[N]>
void function(T t[N]) {
    // do stuff with t[0] through t[N-1]
}

(我意识到上面的语法无效)

我知道实现此目的的一种方法是在sizeof...(ArgsT) 上使用static_assert,其中ArgsT 是可变参数模板定义(即template &lt;typename ...ArgsT&gt;)。

我只是想知道是否有更好的方法,不一定涉及static_assert

【问题讨论】:

  • static_assert 已经是一个不错的编译失败(坚持下去)
  • 总之,当包大小不等于 int 参数时,您想要编译时错误? static_assert 就是为此而生的,为什么不是最好的方式呢?
  • 您也可以将 SFINAE 与 std::enable_if 一起使用。但我不确定它是否更好。
  • @Jarod42:区别在于您是否希望重载存在。除非不污染重载集很重要,否则静态断言可能会产生更容易的诊断。

标签: c++ templates c++11


【解决方案1】:

您可以使用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) { ... }
};

【讨论】:

  • 构造函数可以这样做吗?
  • @par 你打算如何传递N
  • 模板 <:size_t n> class A { /* STUFF */ };
  • 作为阅读本文的其他人的总结:应该注意static_assert 可能是实现上述目标的语义更有意义的方式,但这是完成所要求的非常聪明的方式。
猜你喜欢
  • 2016-12-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多