扣除其他类型的依赖类型
Deduct type of which other type is dependent
我有这种情况:
#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中使用。
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 当基类是依赖类型时,这是一个缺陷吗
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 为什么依赖模板类型在部分专用化中不可推导?
- 为什么即使直到最后才定义实际类型,也可以将依赖名称视为完整
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 类型依赖于可变参数模板的类
- 类型依赖模板名称
- 模板类型依赖和继承
- C++中的循环类型依赖项死锁
- c++ 中带有容器迭代器的循环类型依赖关系(GCC 失败,而 MSVC 正常)
- C++使变量类型依赖于用户输入
- 使返回类型依赖于调用源
- 如何专用化基于类型依赖类型的C++模板化类函数
- 将 POD 联合双关到基本类型:依赖于实现或符合标准
- 使用类型依赖模板名的声明
- 非类型模板参数,其类型依赖于另一个参数