首页 > 编程语言 >C++ 模板特化

C++ 模板特化

时间:2023-10-09 11:14:32浏览次数:30  
标签:函数 void C++ template 特化 模板 cout

模板特化

介绍

  • 模板特化是指在模板的基础上,针对某些特定的值,提供一种特殊的实现方式,模板特化分为两种,类模板特化和函数模板特化

类模板特化

  • 类模板特化指的是在类模板上,针对某些特定的类型和值,提供一种特殊的实现方式。类模板特化分为全特化和偏特化两种。

类模板全特化

  1. 定义
    • 全特化是指将模板参数列表中的所有参数都确定化;
  2. 示例
// class_Template_Ful_Specification.cpp
/**
 * 类模板全特化
 * 代码中,定义了一个名为 MyType 的类模板
 * 使用类模板全特化提供了一个 int 类型的特殊实现
*/

#include<iostream>

using namespace std;

template <typename T>
class MyType
{
public:
    void print(){
        cout << "This is a generic type." << endl;
    }
};

template <>
class MyType<int>
{
public:
    void print(){
        cout << "This is an integer type" << endl;
    }
};

int main()
{
    MyType<float> f;
    f.print();

    MyType<int> i;
    i.print();

    return 0;
}

类模板偏特化

  1. 定义
    • 偏特化是指模板参数列表的一部分参数确定化
  2. 示例
// Class_Template_Partial_Specification.cpp
/**
 * 类模板偏特化
 * 定义了一个 MyType 的类模板,然后使用类模板提供一个针对第二个参数为 int 类型的特殊实现
*/
#include<iostream>

using namespace std;

template <typename T1, typename T2>
class MyType
{
public:
    void print(){
        cout << "This is a generic type" << endl;
    }
    
};

template <typename T>
class MyType<T,int>
{
private:
    /* data */
public:
    void print(){
        cout << "This is a type with an interger as its second parmeter." << endl;
    }
};

int main()
{
    MyType<float, double> f;
    f.print();

    MyType<int,int> i;
    i.print();

    return 0;
}

函数模板特化

  • 函数模板特化指的是在函数模板的基础上,针对某些特定的类型或值,提供一种特殊的实现方式。函数模板特化分为全特化和偏特化两种:

函数模板全特化

  1. 定义
    • 全特化是指将函数模板中所有参数都确定化;
  2. 示例
// Function_Template_Full_Specification.cpp
/**
 * 函数模板全特化:
 * 定义一个名为 MySwap 的函数模板,然后使用函数模板全特化来提供一个针对 double 类型的特殊实现
*/
#include<iostream>

using namespace std;

template<typename T>
void MySwap(T& a, T& b)
{
    T temp = a;
    a = b;
    b = temp;
}

template <>
void MySwap(double& a, double & b)
{
    cout << "This is a special implementation for double types." << endl;
    double temp = a;
    a = b;
    b = temp;
}

int main()
{
    int x = 5, y = 10;
    MySwap(x,y);
    cout <<"X : " << x << " Y : " << y <<endl;

    double p = 3.14, q = 6.28;
    MySwap(p, q);
    cout << "P : " << p << " Q : " << q << endl;

    return 0;
}

函数模板偏特化

  1. 定义
    • 偏特化是指将函数模板中的一部分参数确定化
  2. 示例
  • 直接使用函数模板偏特化,C++ 编译器不支持
// Function_Template_Partial_Specification.cpp
/**
 * 函数模板偏特化
 * 
*/

#include <iostream>

using namespace std;

template<typename A, typename B> 
void f(A a, B b)
{
    cout << "Normal Version" << endl;
}

// 函数模板偏特化,但是编译器不支持函数模板偏特化
/*
template<typename A> 
void fun<A,int>(A a, int b)
{
    cout << "Partial Version" << endl;
}
*/

int main()
{
    int a = 10;
    double b = 12;
    f(a,b);
    f(a,a);

    return 0;
}
  • 使用类模板偏特化间接实现函数模板偏特化
#include <iostream>

using namespace std;

// 借助类模板偏特化,使用 Functor 代替函数
template <typename A, typename B>
class F
{
public:
    F(A a, B b):a_(a), b_(b){}
    void operator() (){
        cout << "Normal version" << endl;
    }

private:
    A a_;
    B b_;
};

template <typename A>
class F<A,int>
{
public:
    F(A a, int b) : a_(a), b_(b){}

    void operator()(){
        cout << "Partial version." << endl;
    }
private:
    A a_;
    int b_;

};

int main()
{
    int a = 10;
    double b = 12;
    F<int, double>(a,b)();
    F<int,int>(a,a)();

    return 0;
}
  • 标签分发,通过函数重载实现函数模板偏特化
#include<iostream>

using namespace std;

struct NormalVersionTag{};
struct IntPartialVersionTag{};

template<class T>
struct TagDispatchTrait
{
    using Tag = NormalVersionTag;
};

template<>
struct TagDispatchTrait<int>
{
    using Tag = IntPartialVersionTag;
};

template <typename A, typename B>
inline void internal_f(A a, B b, NormalVersionTag)
{
    cout << "Normal Version" << endl;
}

template <typename A, typename B>
inline void internal_f(A a, B b, IntPartialVersionTag)
{
    cout << "Partial Version" << endl;
}

template <typename A, typename B>
void f(A a, B b)
{
    return internal_f(a, b, typename TagDispatchTrait<B>::Tag {});
}

int main()
{
    int a = 10;
    double b = 12;
    f(a,b);
    f(a,a);

    return 0;
}

标签:函数,void,C++,template,特化,模板,cout
From: https://www.cnblogs.com/wanghao-boke/p/17750991.html

相关文章

  • C++提高编程
    C++提高编程本文主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用1模板1.1模板的概念模板就是建立通用的模具,大大提高复用性例如生活中的模板一寸照片模板:PPT模板:模板的特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的1.2函数模板......
  • C++基础入门
    C++基础入门1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目​ VisualStudio是我们用来编写C++程序的主要工具,我们先将它打开1.1.2创建文件右键源文件,选择添加->新建项给C++文件起个名称,然后点击添......
  • 无涯教程-Meteor - 模板(Template)
    Meteor模板正在使用三个顶级标签。前两个是head和body。这些标签执行与常规HTML相同的功能,第三个标签是template。这是无涯教程将HTML连接到JavaScript的地方。简单模板以下示例显示了它是如何工作的。无涯教程正在创建一个name=“myParagraph”属性的模板,无涯教程可以......
  • C++ 使用getline()从文件中读取一行字符串
    我们知道,getline()方法定义在istream类中,而fstream和ifstream类继承自istream类,因此fstream和ifstream的类对象可以调用getline()成员方法。当文件流对象调用getline()方法时,该方法的功能就变成了从指定文件中读取一行字符串。该方法有以下2种语法格式:istream&......
  • VS Code配置C++开发环境(MSVC)
    前置知识这些内容如果感兴趣可以看一下,不看也不妨碍配置环境,因为我会一步步教你配置。(但我希望你还是看一下,毕竟我写了好久......
  • 关于C++拷贝控制
    通常来说,对于类内动态分配资源的类需要进行拷贝控制:要在拷贝构造函数、拷贝赋值运算符、析构函数中实现安全高效的操作来管理内存。但是资源管理并不是一个类需要定义自己的拷贝控制成员的唯一原因。C++Primer第5版中给出了一个Message类与Folder类的例子,分别表示电子邮件消息......
  • C++ OOP(1)
    目录类声明成员函数构造函数和析构函数文件组织this指针类声明classClassName{ private: //datamemberdeclarations;public: //memberfuntiondeclarations;};成员函数一般定义成员函数的方式是在类外,通过域解析运算符指定成员函数属于哪个类#includ......
  • C++接口自动注册
    #include<iostream>#include<memory>template<typenameT>classInterface{public:staticInterface&instance(){staticInterfaceinst;returninst;}staticvoidreg(T*impl){instance().m_im......
  • c++如何读取txt文件内容
    一、c++文件流:fstream //文件流ifstream //输入文件流ofstream //输出文件流 二、文件路径的表示1、绝对路径:inf.open("d://DEV_C++//LogFile//游泳数据//LUYINGYAN1039_SensorLog.txt");   注意:双斜线"\\" 2、相对路径:对相对路径而言,路......
  • DEV_C++新建项目及多线程实现
    一、单个C++程序(多线程)//实现txt文件的读入并重写入另外一个txt文件中~#include<fstream>//ifstream#include<iostream>#include<string>//包含getline()#include<string.h>#include<pthread.h>#include<windows.h>//#include<cmath>usin......