C++:部分模板专用化用例
C++: Partial template specialization Use Cases
我观察到,每当模板类是专用的(部分/完全(时,都需要显式定义所有成员函数,否则会出现错误。下面是一个示例
#include <iostream>
template<typename T, typename U> //Primary
struct test
{
void f() { std::cout << "nPrimary"; }
void g() { std::cout << "Called g()n";}
};
template <typename T> //Specialization
struct test<T, int*>
{
void f() { std::cout << "nPartial Specialization"; }
};
template<> //Full specialization
struct test<int*, int*>
{
void f() { std::cout << "nFull Specializationn"; }
};
int main()
{
test<int, double> t1;
t1.f();
t1.g();
test<double, int*> t2;
t2.f();
t2.g();
test<int*, int*> t3;
t3.f();
t3.g();
}
这里t2.g()
和t3.g()
给出了编译时错误,因为它们没有显式定义。如果对于每个专用化,则需要再次定义成员函数。允许部分/完全专业化的优势是什么?
我认为你在这里弄错了类专业化的概念。 班级专业化不inheritance
.专用类与初始类不同。两者之间没有任何共享。因此,在专门的方法中不存在任何g()
方法。
如果您正在寻找一种方法来使方法不同,您应该研究方法专用化。
我认为专业化的主要目的是定义"异常",如果你想以不同的方式处理某些数据类型。
查看部分专业化,请考虑以下几点:
// NOT specialized
template <typename T>
struct test <T, T>
{
...
};
// partially specialized
template <typename T>
struct test <T*, T*>
{
...
};
后一个示例已经部分专用,因为您告诉编译器需要任何类型的指针。这当然很有用,因为您可能希望处理与非指针类型略有不同的指针类型(例如,检查是否为 NULL(
我建议阅读这篇文章
相关文章:
- .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
- 合并一组模板专用化