【发布时间】:2020-04-06 10:47:23
【问题描述】:
函数“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<> 类型的前导参数后跟任意数量的 @987654325 的情况,我需要重载@像这样:
// 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 )
起初你会认为编译器应该很容易匹配这个,如果它已经可以做其他情况的话。这里绝对没有歧义!?但是,匹配失败,没有错误消息,只是编译器忽略了所需的重载。
目前使用 VS2017 和 /std:c++17
注意事项:
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>... 这样的专业化,则不应该存在模棱两可的情况。
【问题讨论】:
-
或者,这是另一种可能的方法:stackoverflow.com/questions/48739516/…
-
感谢您迄今为止的建议。 50个软糖点真的很有吸引力,嗯。是的,另一个级别的间接(元组、结构、模板等)会像往常一样解决它。但是,应该有一个更简单的方法。也许必须等待 C++33。
-
至于为什么它不像你想象的那么容易。想象一个参数 X,它既不是
ATT也不是NVP。但是两者都可以从 X 构造。显然,更好的编译器只有在这种情况发生时才会抱怨。但我们在这里...... -
我不知道也不确定隐式构造/转换是否应该发生在这样的模板化参数或一般模板中。
标签: c++ c++17 variadic-templates variadic-functions overload-resolution