我有这种情况:
#include <vector>
template<typename T, typename U = T>
U f(T data) {
return U();
}
int main() {
std::vector<int> vec = {1,2,3};
return f<std::vector<int>, int>(vec);
}
T
始终是模板类型,U
始终是T
所依赖的类型。是否有一种方法可以从U
获取T
,以便在int
调用中两次不显式f
?
我尝试了以下方法,但没有用:
#include <vector>
template<template<class> class T, class U>
U f(T<U> data) {
return U();
}
int main() {
std::vector<int> vec = {1,2,3};
return f<std::vector, int>(vec);
}
答案 0 :(得分:3)
这里的问题是std::vector
不仅只有一个模板参数。它还具有分配器类型的参数。为了解决这个问题,您可以添加另一个模板参数,或者只使用可变参数模板模板参数,例如
template<template<class...> class T, class U>
U f(T<U> data) {
return U();
}
将与
一起使用return f<std::vector, int>(vec);
甚至更好
return f(vec);
请注意,此行为已在C ++ 17中更改。他们使用DR: Matching of template template-arguments excludes compatible templates放宽了规则,并
template<template<class> class T, class U>
U f(T<U> data) {
return U();
}
将在C ++ 17模式下与gcc一起使用,并在启用了-frelaxed-template-template-args
的C ++ 17中与clang一起使用。