扣除其他类型依赖的类型

Joã*_*ulo 2 c++ templates

我有这种情况:

#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);
}
Run Code Online (Sandbox Code Playgroud)

T始终是模板化类型,U并且始终是T依赖的类型。有没有办法让UT为了不明确的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);
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

这里的问题是std::vector不仅只有一个模板参数。它还具有分配器类型的参数。为了解决这个问题,您可以添加另一个模板参数,或者仅使用可变参数模板模板参数,例如

template<template<class...> class T, class U>
U f(T<U> data) {
    return U();
}
Run Code Online (Sandbox Code Playgroud)

将与

return f<std::vector, int>(vec);
Run Code Online (Sandbox Code Playgroud)

甚至更好

return f(vec);
Run Code Online (Sandbox Code Playgroud)

请注意,此行为已在C ++ 17中更改。使用DR:模板模板参数的匹配排除了兼容模板,他们放宽了规则,

template<template<class> class T, class U>
U f(T<U> data) {
    return U();
}
Run Code Online (Sandbox Code Playgroud)

将在C ++ 17模式下与gcc一起使用,并在C ++ 17模式下与clang一起-frelaxed-template-template-args启用。