如何解决可变参数模板函数中对重载函数的歧义调用
我正在使用可变参数模板函数,其中函数参数不是模板化类型。
我遇到了编译错误:
错误C2668'_TailHelper':对重载函数的模糊调用
这是代码段。
template <typename HEAD>
void _TailHelper(int) {
std::cout << typeid(HEAD).name() << std::endl;
}
template <typename HEAD,typename ... TAILS>
void _TailHelper(int x) {
_TailHelper<HEAD>(x);
_TailHelper<TAILS...>(x);
}
int main(){
_TailHelper<int,double>(2);
}
解决方法
两个重载都与单个模板参数匹配,因此必须禁用一个。例如这样的
#include <iostream>
#include <typeinfo>
template <typename T>
void TailHelper(int) {
std::cout << typeid(T).name() << std::endl;
}
template <typename HEAD,typename ... TAILS>
typename std::enable_if<(sizeof...(TAILS) != 0)>::type
TailHelper(int x) {
TailHelper<HEAD>(x);
TailHelper<TAILS...>(x);
}
int main() {
TailHelper<int,double>(2);
}
,
歧义的呼叫来自此行:
_TailHelper<HEAD>(x);
此调用将第一个功能与第二个功能匹配,第二个功能的第二个参数可以引用零或更多模板参数。
,作为递归的替代方法,您可以“遍历”可变参数:
在C ++ 17中:
template <typename... Ts>
void PrintTypes() {
((std::cout << typeid(Ts).name() << std::endl),...);
}
在以前的版本中,它不太优雅,您可以使用以下技巧:
template <typename... Ts>
void PrintTypes() {
const int dummy[] = {0,((std::cout << typeid(Ts).name() << std::endl),0)...};
static_cast<void>(dummy); // Avoid warning for unused variable
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。