1. 程式人生 > 實用技巧 >c++變長引數模板函式

c++變長引數模板函式

1. C++模板類

C++中有一個重要特性,那就是模板型別。類似於Objective-C中的泛型。C++通過類模板來實現泛型支援。

1.1 基礎模板類

類模板,可以定義相同的操作,擁有不同資料型別的成員屬性。通常使用template來宣告。告訴編譯器,碰到T不要報錯,表示一種泛型.如下,宣告一個普通的類模板:

template<class T>
void foo(T a, T b){
    //content ;  
}

宣告一個模板類

template <typename T>
class Complex{
    
public:
    //建構函式
    Complex(T a, T b)
    {
        
this->a = a; this->b = b; } //運算子過載 Complex<T> operator+(Complex &c) { Complex<T> tmp(this->a+c.a, this->b+c.b); return tmp; } private: T a; T b; } int main() { //物件的定義,必須宣告模板型別,因為要分配內容 Complex<int> a(10
,20); Complex<int> b(20,30); Complex<int> c = a + b; return 0; }

1.2 繼承模板類

在模板類的繼承中,需要注意以下幾點:

  • 如果父類自定義了建構函式,記得子類要使用建構函式列表來初始化
  • 繼承的時候,如果子類不是模板類,則必須指明當前的父類的型別,因為要分配記憶體空間
  • 繼承的時候,如果子類是模板類,要麼指定父類的型別,要麼用子類的泛型來指定父類;
template <typename T>
class Parent{
public:
    Parent(T p)
    {
        
this->p = p; } private: T p; }; //如果子類不是模板類,需要指明父類的具體型別 class ChildOne:public Parent<int>{ public: ChildOne(int a,int b):Parent(b) { this->cone = a; } private: int cone; }; //如果子類是模板類,可以用子類的泛型來表示父類 template <typename T> class ChildTwo:public Parent<T>{ public: ChildTwo(T a, T b):Parent<T>(b) { this->ctwo = a; } private: T ctwo; };

2. 引數變長函式

變長模板、變長引數是依靠C++11新引入的引數包的機制實現的。

具體的實現方法為:

template <class ... Args>

可通過sizeof...(args)統計引數包所含元素的個數。

對引數包進行處理有遞迴方式和非遞迴方式。

1 遞迴處理引數包

// 通過遞迴函式展開引數包,需要提供一個引數包展開的函式和一個遞迴終止函式。
//遞迴終止函式 (必須宣告在展開函式之前 )
void debug()
{
    out("empty");
}
//展開函式
template <class T, class ... Args>
void debug(T first, Args ... last)
{
    cout << "parameter " << first << endl;
    out(typeid(first))
    out(sizeof...(last));
    debug(last...);
}

應當注意:遞迴終止條件的函式過載,必須放在展開函式之前。

參考:

1.https://www.cnblogs.com/lsgxeva/p/7787500.html

2.https://blog.csdn.net/yanxiangtianji/article/details/21045525?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242

3.https://blog.csdn.net/qq_28351609/article/details/84631960