欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C++類型萃?。ǚ治募芾恚?/h1>

類型萃取
類型萃取是基于c++中的模板特化來實(shí)現(xiàn)的,是對于模板特化的應(yīng)用。

成都創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站設(shè)計網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元綏化做網(wǎng)站,已為上家服務(wù),為綏化各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

以通用的拷貝函數(shù)為例

拷貝函數(shù),c++自帶的拷貝函數(shù)是俗稱的淺拷貝,淺拷貝對于一些內(nèi)置類型而言不會出錯,但對于一些自定義類型在拷貝的時候就會出現(xiàn)內(nèi)存訪問錯誤(中斷),想回顧淺拷貝的“同志”可以看https://blog.51cto.com/14233078/2442527
1.此方案雖然解決了拷貝問題,但是缺點(diǎn)也很明顯,在每一次拷貝數(shù)據(jù),都需要遍歷一遍,時間復(fù)雜度O(1)

#include<iostream>
using namespace std;
#include<string>

template<class T>
void Copy1(T* dst, T* src, size_t size)
{
    memcpy(dst, src, sizeof(T)*size);
}

// 優(yōu)點(diǎn):一定不會出錯
// 缺陷:O(N)
template<class T>
void Copy2(T* dst, T* src, size_t size)
{
    for (size_t i = 0; i < size; ++i)
        dst[i] = src[i];
}

bool IsPODType(const char* strType)
{
    // 此處可以將所有的內(nèi)置類型枚舉出來
    const char* strTypes[] = { "char", "short", "int", "long", "long long", "float", "double" };
    for (auto e : strTypes)
    {
        if (strcmp(strType, e) == 0)
            return true;
    }

    return false;
}

template<class T>
void Copy(T* dst, T* src, size_t size)
{
    // 通過typeid可以將T的實(shí)際類型按照字符串的方式返回
    if (IsPODType(typeid(T).name()))
    {
        // T的類型:內(nèi)置類型
        memcpy(dst, src, sizeof(T)*size);
    }
    else
    {
        // T的類型:自定義類型---原因:自定義類型中可能會存在淺拷貝
        for (size_t i = 0; i < size; ++i)
            dst[i] = src[i];
    }
}

void TestCopy()
{
    int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    int array2[10];
    Copy(array2, array1, 10);

    string s1[3] = { "1111", "2222", "3333" };
    string s2[3];
    Copy(s2, s1, 3);
}

int main()
{
    TestCopy();
    return 0;
}

C語言參與編譯的是.c文件,一個.c文件是一個編譯單元。
頭文件在預(yù)處理階段被展開,即,預(yù)處理器看見#include預(yù)處理指令的時候,就用相應(yīng)頭文件的內(nèi)容替換掉這個#include預(yù)處理指令(把頭文件內(nèi)容拷貝到.c文件中,然后刪除這條#include預(yù)處理指令)。
你應(yīng)該把頭文件看出是導(dǎo)出給外部模塊使用的接口,里面存放外部模塊需要使用的宏定義及函數(shù)原型。
在linux下,可以用gcc -E查看預(yù)處理之后的文件。
頭文件中的函數(shù)原型是提供給編譯器作為函數(shù)原型檢查的,對于不是本源文件中的函數(shù),編譯過程中并不會產(chǎn)生實(shí)際的調(diào)用代碼(函數(shù)調(diào)用需要知道確切的函數(shù)地址),只是在相應(yīng)的地方做個標(biāo)記,表示在這里需要調(diào)用某個函數(shù)。編譯完成產(chǎn)生的是匯編代碼。
如上所述,編譯產(chǎn)生的匯編代碼并不能直接運(yùn)行,因?yàn)橥獠亢瘮?shù)調(diào)用的地方還沒給予確切的函數(shù)地址。這個工作由鏈接過程完成。鏈接器會查找其它源文件所產(chǎn)生的匯編代碼,進(jìn)而找到正確的函數(shù)調(diào)用地址,然后用這個地址替換掉在編譯時做的標(biāo)記。完成這一步后,程序就可以實(shí)際運(yùn)行了。
因此,.h是根本不會被編譯的,它如果被包含,則會被預(yù)處理器將其內(nèi)容一分不差的拷貝到.c文件中,.編譯器編譯的是拷貝后的這個.c文件。

2.分文件管理:
因?yàn)轭^文件在預(yù)處理階段就已完成,所以不會降低代碼效率,因此解決1中代碼效率低的問題

頭文件

#pragma once

#include<iostream>
using namespace std;
#include<string>

//來自自定義類型
struct TrueType
{};

// 對應(yīng)自定義類型
struct FalseType
{};

//隱示實(shí)例化
template<class T>
struct TypeTraits
{
    typedef FalseType PODTYPE;  // plain old data
};

//顯示實(shí)例化
template<>
struct TypeTraits<char>
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits<short>
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits<int>
{
    typedef TrueType PODTYPE;
};
template<>
struct TypeTraits<long>
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits<long long>
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits<float>
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits<double>
{
    typedef TrueType PODTYPE;
};

void TestCopy();

源代碼

#include"Type_extraction.h"

template<class T>
void Copy(T* dst, T* src, size_t size, TrueType)
{
    // T的類型:內(nèi)置類型
    memcpy(dst, src, sizeof(T)*size);
}

template<class T>
void Copy(T* dst, T* src, size_t size, FalseType)
{
    // T的類型:自定義類型---原因:自定義類型中可能會存在淺拷貝
    for (size_t i = 0; i < size; ++i)
        dst[i] = src[i];
}

template<class T>
void Copy(T* dst, T* src, size_t size)
{
    Copy(dst, src, size, TypeTraits<T>::PODTYPE());
}

void TestCopy()
{
    int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    int array2[10];
    Copy(array2, array1, 10);

    string s1[3] = { "1111", "2222", "3333" };
    string s2[3];
    Copy(s2, s1, 3);
}

測試文件main.c

#include"Type_extraction.h"

int main()
{
    TestCopy();
    return 0;
}

模板的聲明和定義必須放在一個文件原因
https://blog.csdn.net/chigusakawada/article/details/78752668
顯示實(shí)例化,隱式實(shí)例化概念
https://blog.csdn.net/qiujianjian/article/details/84792608

網(wǎng)頁題目:C++類型萃?。ǚ治募芾恚?/a>
瀏覽路徑:
http://aaarwkj.com/article28/gjdejp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站改版、移動網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
久久精品国产亚洲七七| 免费女同一区二区三区| 婷婷av一区二区三区| 麻豆片免费观看在线看| 精品亚洲一区二区在线| 免费欧美一级黄片播放| 91麻豆成人精品国产| 国产精品1区2区久久久| 97视频高清在线观看| 国产一区二区主播不卡| 免费黄色福利网址大片| 成人中文字幕av电影| 精品一区精品二区国产日韩| 成人av男人天堂东京热| 丰满的少妇一区二区三区免费观看 | 中文字幕亚洲无级av| 激情偷拍一区二区三区视频| 中文字幕av久久激情| 精品自拍一区在线观看| 日韩精品在线观看视频一区二区三区| 黄片视频免费在线播放大全| 午夜性色在线视频福利| 亚洲理论电影在线观看| 亚洲欧美综合一区二区三区| 青青草网站在线观看视频| 日韩一区精品视频一区二区| 日日嗨av特一级黄淫片| 欧美成人免费做真爱高潮| 国产剧免费看视频网站成人| 天堂免费av在线播放| 日韩欧美性生活免费观看| 国产午夜福利片新视觉| 日韩亚洲中文一区三级黄片| 在线播放国产91精品| 91久久精品国产一区| 人妻少妇被猛烈进入中文字幕91| 青青草青娱乐免费在线视频| 日韩av不卡免费播放| 男同午夜视频在线观看| 精品人妻av区久久久| 亚洲最大午夜福利视频|