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