std remove_cv

1、實現(xiàn)分析

模版處理過程中會自動完成 const volatile int 的排序

// Const-volatile modifications.

  /// remove_const
  template<typename _Tp>
    struct remove_const
    { typedef _Tp     type; };

  template<typename _Tp>
    struct remove_const<_Tp const>
    { typedef _Tp     type; };

  /// remove_volatile
  template<typename _Tp>
    struct remove_volatile
    { typedef _Tp     type; };

  template<typename _Tp>
    struct remove_volatile<_Tp volatile>
    { typedef _Tp     type; };

  /// remove_cv
  template<typename _Tp>
    struct remove_cv
    {
      typedef typename
      remove_const<typename remove_volatile<_Tp>::type>::type     type;
    };

2、demo code

#include<string>
#include<iostream>
#include <stdlib.h>
#include<iostream>

using std::cout;
using std::endl;
using std::system;
using std::string;

void exec_my_cmd(const string cmd) {  
    FILE *fp;  
    int status;  
  
    // 使用popen執(zhí)行bash命令  
    fp = popen(cmd.c_str(), "r");  
    if (fp == NULL) {  
        perror("popen failed:");  
        return;  
    }
  
    // 讀取命令輸出(可選)  
    char buffer[1024];  
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {  
        cout << buffer;
    }
    //cout << endl;
  
    // 使用pclose關(guān)閉進(jìn)程并獲取返回值  
    status = pclose(fp);  
    if (WIFEXITED(status)) {  
        //int exit_status = WEXITSTATUS(status);  
        //cout << "Command exited with status " << exit_status << endl;  
    } else if (WIFSIGNALED(status)) {  
        int signal_number = WTERMSIG(status);  
        cout << "Command was killed by signal " << signal_number << endl;  
    }
}

void printf_type_info(const string variable, const string typeinfo) {
    cout << variable << ":\t";
    string cmd{"c++filt --type "};
    cmd.append(typeinfo);
    exec_my_cmd(cmd);
}

using std::remove_cv;

void test_remove_cv() {
    int i = 1;
    int const i_c = 1;
    int const volatile i_c_v = 1;
    int volatile const i_v_c = 1;
    const int volatile c_i_v = 1;
    const volatile int c_v_i = 1;
    volatile const int v_c_i = 1;
    volatile int const v_i_c = 1;
    int &ref_i = i;
    
    printf_type_info("int", typeid(i).name());
    printf_type_info("int const", typeid(i_c).name());

    printf_type_info("int const volatile", typeid(i_c_v).name());  // typeid 可以獲取運行時類型 所以const 和 volatile 運行時不會有記錄,只有int 返回
    printf_type_info("int volatile const", typeid(i_v_c).name());
    printf_type_info("const int volatile", typeid(c_i_v).name());
    printf_type_info("const volatile int", typeid(c_v_i).name());
    printf_type_info("volatile const int", typeid(v_c_i).name());
    printf_type_info("volatile int const", typeid(v_i_c).name());

    printf_type_info("ref_i", typeid(ref_i).name());
}


int main() {
    test_remove_cv();

    return 0;
}

輸出:

[remove_cv]$ ./test
int:    int
int const:      int
int const volatile:     int
int volatile const:     int
const int volatile:     int
const volatile int:     int
volatile const int:     int
volatile int const:     int
ref_i:  int
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • remove_cv 去掉變量的cv屬性,獲取其原始類型信息。 實現(xiàn)方式模版推導(dǎo)丟棄const和volatile參數(shù)...
    i_need_job閱讀 1,617評論 0 1
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,260評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,667評論 1 32
  • 三重:代碼、底層內(nèi)存、源碼 第一階段:開發(fā)常用JavaSE基礎(chǔ)、IDE、Maven、Gradle、SVN、Git、...
    guodd369閱讀 17,523評論 1 44
  • 寫在前面: 猶豫了一下,不知道該不該發(fā)這么多。畢竟題目雖全,但是其實很多人看了不到一半,估計就會默默的收藏保存,等...
    Yt_cc閱讀 14,927評論 1 6

友情鏈接更多精彩內(nèi)容