【发布时间】:2021-12-27 07:43:13
【问题描述】:
有时您只是发现自己想在 C++ 中使用多个参数包。
考虑以下伪代码:
template<class...T1, int, class...T2>
struct bar
{
tuple<vector<T1>...> v1;
tuple<vector<T2>...> v2;
};
int main()
{
bar<int, bool, char, 0, long int, char> my_bar;
return 0;
}
理论上,某种语言的编译器可以编译此代码,因为int 作为两个参数包之间的分隔符可以让编译器成功解析模板参数列表并识别两个唯一的参数包。然而,这在 C++ 中不受支持,考虑到做这种事情的技术根本不存在,这是有道理的。
考虑以下伪代码:
template<class...T1, class...T2>
struct bar
{
tuple<vector<T1>...> v1;
tuple<vector<T2>...> v2;
constexpr bar(const tuple<T1...>, const tuple<T2...>) { };
};
int main()
{
bar my_bar(tuple<int, bool, char>(), tuple<long int, char>());
return 0;
}
理论上,某种语言的编译器可以编译此代码,因为可以根据传递给构造函数的参数自动推导出参数包。如果对象的构造方式使得无法推断模板参数,则可能会引发编译器错误。然而,这在 C++ 中不受支持,考虑到做这种事情的技术根本不存在,这是有道理的。
这是一种解决方法。考虑以下有效的 C++ 代码:
template<class...T1>
struct bar
{
template<class...T2>
struct dummy
{
tuple<vector<T1>...> v1;
tuple<vector<T2>...> v2;
};
};
int main()
{
bar<int, bool, char>::dummy<long int, char> my_bar;
return 0;
}
这是一种分离参数包的方法,但它并不优雅。谁想在他们的代码中间写“虚拟”?
除了您知道的多个参数包之外,还有其他替代方法吗?
【问题讨论】:
-
那么,问题是什么?
-
我建议将您的问题重新表述为关于您解决的问题的问题,然后将您的解决方案移至答案。自我回答的问题在这里非常好——它们对未来的访问者很有用,并允许其他人提供替代解决方案。如果您有两个不能很好地组合在一起的解决方案,您甚至可以考虑将它们分成两个单独的答案,以便分别对每个答案进行投票和评论。
标签: c++ templates tuples variadic-templates template-meta-programming