扣除其他类型的依赖类型

Deduct type of which other type is dependent

本文关键字:类型 依赖 其他      更新时间:2023-10-16

我有这种情况:

#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依赖的类型。是否有一种方法可以从T获取U,以便在f中两次不明确int

我已经尝试了以下操作,但是它没有用:

#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);
}

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

(
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:模板模板 - arguments的匹配不包括兼容模板,他们放松了规则,

template<template<class> class T, class U>
U f(T<U> data) {
    return U();
}

将在C 17模式下使用GCC,并在-frelaxed-template-template-args启用的C 17中使用。