其他分享
首页 > 其他分享> > c-为什么一个可变参数类模板最多具有一个参数包?

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

作者:互联网

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

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:

If a template-parameter of a primary class template or alias template is a
template parameter pack, it shall be the last template-parameter.

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

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

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

我绝不is测为什么标准是什么(很明显如此),但是可以
有人权威地告诉我们为什么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”一词,看来造成此限制的唯一原因是简单性.特别是起草标准而不是实施的简单性.

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

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

标签:c,variadic-templates,standards,compiler-construction
来源: https://codeday.me/bug/20191010/1885340.html