程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C++ 2011 STL (VS2012 Update4) 源代碼閱讀系列(1)]准備知識

[C++ 2011 STL (VS2012 Update4) 源代碼閱讀系列(1)]准備知識

編輯:C++入門知識

/*
prepare.cpp
演示了閱讀 STL 原代碼的一些預備知識
1. 模版以及模版的偏特化,是 STL 源代碼裡面用的很多的技術,
有效的解決了支持不同參數個和類型的問題;
2. 各式各樣的宏定義,用於定義構造函數,重載函數實現,需要不斷的展開,
這個也是平時代碼很少見的特征
*/

//標明是使用 MS版本,本處使用 VS2012 update 4
#include "stdafx.h"
#include <iostream>
#include <sstream>

using namespace std;

#define join_1(a,b) a+b
#define join_2(a,b) ab
#define join_3(a,b) a##b
#define join_4(a,b) v_ ## a ## _ ## b ## _t
void test_micro()
{
    //演示了宏的一些定義
    int x = 11,y = 22;
    std::cout<<join_1(x,y)<<endl;
    //注意,是輸出了變量的值
    int ab = 333;
    std::cout<<join_2("x","y")<<endl;
    int xy = 999;
    std::cout<<join_3(x,y)<<endl;
    int v_11_22_t = 9999;
    std::cout<<join_4(11,22)<<endl;
    int v_x_y_t = 99999;
    std::cout<<join_4(x,y)<<endl;
}

//聲明一個模版類,容許最少有一個模板參數,最多有4個模板參數,
//該最多模版參數的空模版沒有實現,所以其他的就只能最多有3個模版參數了
//最後一個class = Null_class,無參數名稱,是標明是不命名模板參數,
//Null_class 是一個空結構體,定義是: struct Null_class{};
//STL 原代碼裡面定義了一個 _Nil
struct Null_class{};
template<class _Fun,class v0_t = Null_class,class v1_t = Null_class,class = Null_class> class _Bind_A;

//專門化(偏特化)模版類
template<class _Fun> class _Bind_A<_Fun>
{
private:
    _Fun m_v;
public:
    _Bind_A(_Fun v):m_v(v)
    {
        //
    }

    const std::string cat()
    {
        std::stringstream str;
        str<<m_v<<endl;
        return str.str();
    }
};

template<class _Fun,class v0_t> class _Bind_A<_Fun,v0_t>
{
private:
    _Fun m_v;
public:
    _Bind_A(_Fun v):m_v(v)
    {
        //
    }

    const std::string cat(v0_t &v)
    {
        std::stringstream str;
        str<<m_v<<v<<endl;
        return str.str();
    }
};

//專門化(偏特化)模版類,同時演示了模板繼存的方式
template<class _Fun,class v0_t,class v1_t> class _Bind_A<_Fun,v0_t,v1_t>
: public std::binary_function<v0_t,v1_t,bool>
{
private:
    _Fun m_v;
public:
    _Bind_A(_Fun v):m_v(v)
    {
        //
    }

    const std::string cat(v0_t &v,v1_t vv)
    {
        std::stringstream str;
        str<<m_v<<v<<vv<<endl;
        return str.str();
    }
};

void test_template()
{
    _Bind_A<int> b_1(10);
    std::cout<<b_1.cat();

    _Bind_A<char,std::string> b_2('C');
    std::string s = "aa";
    std::cout<<b_2.cat(s);

    _Bind_A<char,std::string,double> b_3('c');  
    std::cout<<b_3.cat(s,99.99);
}

int _tmain(int argc, _TCHAR* argv[])
{

    std::cout<<"test_micro start\n";
    test_micro();
    std::cout<<"test_micro end\n";
   
    std::cout<<"\ntest_template start\n";
    test_template();
    std::cout<<"test_template end\n";

    system("pause");

    return 0;
}

 

 

test_micro start
33
333
999
9999
99999
test_micro end

test_template start
10
Caa
caa99.99
test_template end
請按任意鍵繼續. . .

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved