c++11 可變參數模板類


c++11 可變參數模板類

 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>

// 在C++11之前,類模板和函數模板只能含有固定數量的模板參數。C++11增強了模板功能,允許模板定義中包含0到任意個模板參數,這就是可變參數模板。

// 可變參數模板類 繼承方式展開參數包
// 可變參數模板類的展開一般需要定義2 ~ 3個類,包含類聲明和特化的模板類
template<typename... A> class BMW{};  // 變長模板的聲明

template<typename Head, typename... Tail>  // 遞歸的偏特化定義
class BMW<Head, Tail...> : public BMW<Tail...>
{//當實例化對象時,則會引起基類的遞歸構造
public:
    BMW()
    {
        printf("type: %s\n", typeid(Head).name());
    }

    Head head;
};

template<> class BMW<>{};  // 邊界條件

// 模板遞歸和特化方式展開參數包
template <long... nums> struct Multiply;// 變長模板的聲明

template <long first, long... last>
struct Multiply<first, last...> // 變長模板類
{
    static const long val = first * Multiply<last...>::val;
};

template<>
struct Multiply<> // 邊界條件
{
    static const long val = 1;
};


void mytest()
{
    BMW<int, char, float> car;
    /*
    運行結果:
        type: f
        type: c
        type: i
    */

    std::cout << Multiply<2, 3, 4, 5>::val << std::endl; // 120


    return;
}


int main()
{
    mytest();

    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM