繁体   English   中英

为什么一个可变参数类模板最多具有一个参数包?

[英]Why can a variadic class template have at most one parameter pack?

有时候,我希望可以编写由可变参数模板参数包的标点符号列表参数化的类模板,例如

template<typename ...lhs, int Punct, typename ...rhs>
struct tuple_pair
{
    std::tuple<lhs...> _lhs;
    std::tuple<rhs...> _rhs;
};

或就此而言:

template<int ...lhs, typename Punct, int ...rhs>
struct seq_pair
{
    std::integer_sequence<int,lhs...> _lhs;
    std::integer_sequence<int,rhs...> _rhs;
};

这些很可能是我希望遭到骇客入侵的时刻,但是无论如何,标准当然说我不能拥有它:§14.1.11:

如果主类模板或别名模板的模板参数是模板参数包,则它应该是最后一个模板参数。

我不明白为什么会这样。 在我看来,在任何实例中,例如

tuple_pair<char,short,0,int,long> tp;
seq_pair<0,2,3,void,4,5,6> sp;

编译器可以...lhs我所能将...lhs参数与...rhs区分开。

对于标准为何如此-强调如此-我无可置疑,但是谁能权威地告诉我们为什么C ++模板机制不以这种方式支持或不支持多个类模板参数包的分离? 我特别想证实或消除怀疑,即存在一个绕开我的根本逻辑障碍。

可变参数模板列表不能作为第一类对象进行操作。 因此,使用包装在某些模板对象中的参数包通常更方便。

这就是将两个类型列表传递给模板类的方式:

// create an empty default implementation
template <typename LeftTuple, typename RightTuple> 
class tuplePair {};

// specialise to allow tupled lists of types to be passed in
template <typename ...LHS, typename ...RHS>
class tuplePair<tuple<LHS...>, tuple<RHS...> > 
{
   // ...
};

//or more catholically:
template <typename ...LHS, typename ...RHS, template<typename...> class tuple_template>
class tuplePair<tuple_template<LHS...>, tuple_template<RHS...>>  
{
   // ...
};

template<typename... X>
class some_other_tuple {};



int main() {
   tuplePair<tuple<char,char,char>, tuple<char,char,char>> tango_tuple;
   tuplePair<some_other_tuple<int>, some_other_tuple<char>> other_tuple;
   return 0;
}

在任何情况下,此公式都比使用某种分隔符( void )更清楚。 作为一般规则,提供列表或元组对象而不是仅使用分隔符的语义更强大(因为它们允许嵌套),并且更易于操纵。

附录:

我可能会给出另一个错误的答案,特别是没有权威性的问题,希望对您有所帮助。

我已经阅读了可变参数模板提案的草案,并在comp.std.C ++上扫描了所有196个线程,并提到了“ variadic”一词,看来造成此限制的唯一原因是简单性。 特别是起草标准而不是实施的简单性。

我找不到关于您提出的概括性的任何讨论(允许在模板参数列表中的任何位置添加参数包,而在其后没有同类参数或参数包)。 但是,还讨论了其他概括,例如允许参数包扩展出现在模板专门化的末尾以外的其他地方,并且看起来这些讨论的时间似乎用光了。

您有说服力的用例吗? 我真的不是要成为“给我看一个用例,否则我会让你失望”的恶霸,我只是有兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM