【问题标题】:How to declare variable number of template arguments?如何声明可变数量的模板参数?
【发布时间】:2012-03-23 13:15:34
【问题描述】:

例如这是boost::tuple的声明

// - tuple forward declaration -----------------------------------------------
template <
  class T0 = null_type, class T1 = null_type, class T2 = null_type,
  class T3 = null_type, class T4 = null_type, class T5 = null_type,
  class T6 = null_type, class T7 = null_type, class T8 = null_type,
  class T9 = null_type>
class tuple;

正如预期的那样,如果我尝试使用更多数量的参数,我会收到以下错误

$ g++ vec.cc 
vec.cc: In function 'int main()':
vec.cc:6: error: wrong number of template arguments (12, should be 10)
/usr/include/boost/tuple/detail/tuple_basic.hpp:75: error: provided for 'template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> class boost::tuples::tuple'
vec.cc:6: error: template argument 1 is invalid
vec.cc:6: error: template argument 2 is invalid
vec.cc:6: error: invalid type in declaration before ';' token
$

有没有一种方法可以声明类以使其接受任意数量的模板参数?

【问题讨论】:

  • 你的意思是它的行为类似于 c++11 std::tuple?
  • @juanchopanza: ... 就像系统中支持可变参数模板的 c++11 元组一样,您的意思是?例如,VS 2011 不支持可变参数模板,我认为元组支持无限类型,只要无限不大于 5。
  • @DavidRodríguez-dribeas 好问题。标准说元组应该支持任意数量的参数,并且标题是模板 类元组。所以我想我的意思是根据 c++11 标准的 std::tuple。

标签: c++ templates boost


【解决方案1】:

C++11 支持variadic templates。这些允许您编写:

template<typename ...Args>
class tuple
{
    // ...
};

但是,没有简单的方法可以迭代可变参数模板的参数。有关此问题的几种解决方法,请参阅链接文章。

【讨论】:

  • 如果您希望对其进行迭代,您始终可以将可变参数包转换为 MPL 序列。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多