函数'Process'正在使用可变类型的变量数目] >>。为了处理不同的情况,我已经像这样成功地重载了它:
// general case template <typename ...Types> void Process( const Types&... items ) // single T template <typename T> void Process( const T& t ) // one or more of type NVP<> template <typename T1, typename ...Types> void Process( const NVP<T1>& nvp1, const NVP<Types>&... nvps )
[我想做的-但不能-是以下] >>:对于具有任意数量的类型为
ATT<>
的前导参数然后跟任意数量的NVP<>
的情况,我需要重载:
// any number of leading Types ATT<> followed by any number of NVP<> template <typename ...ATypes, typename ...BTypes> void Process( const ATT<ATypes>&... atts, const NVP<BTypes>&... nvps )
首先,如果编译器已经可以完成其他情况,那么匹配它会很容易。这里绝对应该没有歧义!但是,匹配失败,没有错误消息,但是所需的重载只是被编译器忽略。
当前与/ std:c ++ 17一起使用VS2017
注意:
[1。
显然,可以对one这样的前导类型ATT<T1>
执行此操作// one leading Type ATT<T1> template <typename T1, typename ...Types> void Process( const ATT<T1>& a1, const Types&... remaining )
但是对于不止一个,我需要进行一些难看的手动递归。 我真的很想拥有一整个领先的
ATT<...>
。
2。我知道,一般类型的前导参数包对于匹配始终是模棱两可的,但对于像ATT<ATypes>...
这样的特殊化,应该不存在歧义。
函数'Process'正在使用可变数量的可变类型参数。为了处理不同的情况,我已经像这样成功地重载了它://一般情况模板
相信您可以在此处使用结构来帮助您。编译器无法确定一个参数包在哪里停止而另一个参数包在哪里开始,请考虑:
foo(1, 2.0, '3', "45", 6.0f)
。第一个参数包可以是空,第一个参数包可以是所有,或者都不是。没有特别的理由要优先于另一个。因此,您不能使函数接受两个变量。您可以做的是将其拆分为两个结构,并为外部类指定explicitly
假设您可以将它们作为元组接受,那么我从https://stackoverflow.com/a/12782697/1480324绘制后就做了这个:
#include <iostream>
#include <tuple>
template<typename T>
struct ATT {};
template<typename T>
struct NVP {};
template<typename... ATTs, typename... NVPs>
void Process(const std::tuple<ATT<ATTs>...>& atts, const std::tuple<NVP<NVPs>...>& nvps) {
std::cout << sizeof...(ATTs) << std::endl;
std::cout << sizeof...(NVPs) << std::endl;
}
int main() {
Process(std::make_tuple(ATT<int>(), ATT<double>()), std::make_tuple(NVP<std::string>(), NVP<bool>()));
return 0;
}
您可以根据const Types&...
是否匹配Types...
,从ATT<T>..., NVP<U>...
重载中调度。
[这里的基本策略是找到最后一个ATT<T>
的索引,将所有内容作为一个元组转发,然后使用适当的索引序列进行索引以转发到另一个函数,其中ATT
值和NVP
值位于两个元组中: