📜  C++中的模板专业化

📅  最后修改于: 2021-05-26 00:34:13             🧑  作者: Mango

C++中的模板是一项功能。我们只编写一次代码,并将其用于任何数据类型,包括用户定义的数据类型。例如,可以编写sort()并将其用于对任何数据类型项进行排序。可以创建一个可用作任何数据类型的堆栈的类堆栈。
如果我们想为特定数据类型使用不同的代码怎么办?考虑一个大型项目,该项目需要一个函数sort()来处理许多不同数据类型的数组。让“快速排序”用于除char之外的所有数据类型。在使用char的情况下,可能的总值为256,而计数排序可能是一个更好的选择。仅当为char数据类型调用sort()时,才可以使用其他代码吗?
在C++中,可能为特定的数据类型获得特殊的行为。这称为模板专门化

CPP
// A generic sort function
template 
void sort(T arr[], int size)
{
    // code to implement Quick Sort
}
 
// Template Specialization: A function
// specialized for char data type
template <>
void sort(char arr[], int size)
{
    // code to implement counting sort
}


CPP
#include 
using namespace std;
 
template 
void fun(T a)
{
   cout << "The main template fun(): "
        << a << endl;
}
 
template<>
void fun(int a)
{
    cout << "Specialized Template for int type: "
         << a << endl;
}
 
int main()
{
    fun('a');
    fun(10);
    fun(10.14);
}


CPP
#include 
using namespace std;
 
template 
class Test
{
  // Data members of test
public:
   Test()
   {
       // Initialization of data members
       cout << "General template object \n";
   }
   // Other methods of Test
};
 
template <>
class Test 
{
public:
   Test()
   {
       // Initialization of data members
       cout << "Specialized template object\n";
   }
};
 
int main()
{
    Test a;
    Test b;
    Test c;
    return 0;
}


另一个示例可以是代表一组元素并支持诸如联合,交集等操作的类Set 。当元素类型为char时,我们可能希望使用大小为256的简单布尔数组来构成一个集合。对于其他数据类型,我们必须使用其他一些复杂的技术。
函数模板专门化的示例程序
例如,考虑以下简单代码,其中对于除int外的所有数据类型都有通用模板fun()。对于int,有一个fun()的专门版本。

CPP

#include 
using namespace std;
 
template 
void fun(T a)
{
   cout << "The main template fun(): "
        << a << endl;
}
 
template<>
void fun(int a)
{
    cout << "Specialized Template for int type: "
         << a << endl;
}
 
int main()
{
    fun('a');
    fun(10);
    fun(10.14);
}

输出:

The main template fun(): a
Specialized Template for int type: 10
The main template fun(): 10.14

类模板专门化的示例程序
在以下程序中,为int数据类型编写了Test类的专用版本。

CPP

#include 
using namespace std;
 
template 
class Test
{
  // Data members of test
public:
   Test()
   {
       // Initialization of data members
       cout << "General template object \n";
   }
   // Other methods of Test
};
 
template <>
class Test 
{
public:
   Test()
   {
       // Initialization of data members
       cout << "Specialized template object\n";
   }
};
 
int main()
{
    Test a;
    Test b;
    Test c;
    return 0;
}

输出:

Specialized template object
General template object
General template object
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”