请尝试简化您的示例,并考虑以下内容:
#include<utility>
template<typename T>
void foo(std::pair<char*, T>) {}
int main() {
foo({"a", 1});
}
它没有编译成功,如您所见。
问题在于{ "a", 1 }
不是std::pair
,尽管您可以按照以下方式从中构建一个:
#include<utility>
void foo(std::pair<char*, int>) {}
int main() {
foo({"a", 1});
}
错误很明显:
无法推断模板参数'T'。
为什么不能呢?
一旦知道T,编译器就可以构造这样的一对。不管怎样,T必须被推导出来,而编译器无法推导出来,因为{“a”,1}不是可以从中推导出它的一对。
无论如何,{“a”,1}都可以转换为一对,在特定情况下转换为std::pair<char*,T>的专业化,但首先必须推导出T。
从哪里推导?当然是一对,但你还没有一对。
以此类推,进入一个循环。
现在让我们讨论一下您尝试做类似事情的可变模板的情况:不用说,如果甚至上面显示的更简单的示例都无法编译,则其可变扩展(如果有)也将由于更多或更少相同的原因而无法编译。
是否有办法为任意数量的参数对编写函数foo?
我会说不行,除非你将一对作为foo的参数。
以下是一个最小的工作示例:
#include<utility>
template <typename... Args>
void foo(std::pair<const char*, Args>&&...) {}
int main() {
foo(std::make_pair("a", 1), std::make_pair("b", "value"));
}
如果您愿意,您也可以推断出第一个参数,只要它的类型是固定的:
#include<utility>
template <typename T, typename... Args>
void foo(std::pair<T, Args>&&...) {}
int main() {
foo(std::make_pair("a", 1), std::make_pair("b", "value"));
}
否则,如果问题没有得到解决,你可以尝试以下方法:
#include<utility>
template <typename... First, typename... Second>
void foo(std::pair<First, Second>&&...) {}
int main() {
foo(std::make_pair("a", 1), std::make_pair(0, "value"));
}
__PRETTY_FUNCTION__
? - skypjack