如何对嵌套类型执行部分模板专用化
How to do a partial template specialization on a nested type?
我有一个模板化类Converter
,我想做一个部分专业化。棘手的部分是我想将其专门化为MyFoo::Vec
MyFoo
再次可以专门用作模板参数。如果这听起来令人困惑,也许代码本身使它更清晰:
#include <iostream>
#include <vector>
template<class To>
struct Converter {
Converter(int from, To& to) {
to = To(from);
}
};
template<class T>
struct Foo {
typedef std::vector<T> Vec;
Vec vec;
};
// Template specialization: Convert from 'From' to 'MyFoo::Vec':
template<class MyFoo>
struct Converter<typename MyFoo::Vec > { // Error: template parameters not
// used in partial specialization
Converter(int from, typename MyFoo::Vec& to) {
to.push_back(typename MyFoo::Vec::value_type(from));
}
};
int main() {
Foo<float> myfoo;
Converter<Foo<float> > converter(2, myfoo.vec);
}
这只是从我的实际代码派生的一个迷你示例。这个问题不是关于这样的转换器有多大用处;我只是对获得正确的语法感兴趣,因为我需要这样的转换器及其专业化。
它不能直接完成。考虑到不可能从嵌套类型转到封闭类型,原因有两个:首先,映射可能不是唯一的(多个Foo
可能具有相同的嵌套Vec
类型),即使它是编译器也必须测试所有现有类型(即它无法从实例化推断)。
你想做的事情实际上可以用SFINAE完成(未经测试的代码,你可以在这里阅读更多):
template <typename T, typename V = void>
struct Converter {}; // Default implementation
template <typename T>
struct Converter<T, T::Vec> {}; // specific if has nested Vec
相关文章:
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 模板专用化(按容器):value_type
- 静态数据成员模板专用化的实例化点在哪里
- 特征 3 类的模板专用化
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 使用其他模板的模板专用化
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- 嵌套模板显式专用化
- 如何检查模板专用化是否是基本模板的子类?
- C++:部分模板专用化用例
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 为什么依赖模板类型在部分专用化中不可推导?
- 如何为静态常量模板化专用整数值分配存储
- 模板类的部分模板专用化,如 std::function
- 合并一组模板专用化