std remove_cv

1、实现分析

模版处理过程中会自动完成 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执行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关闭进程并获取返回值  
    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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容