1存和、實(shí)現(xiàn)分析
模版處理過(guò)程中會(huì)自動(dòng)完成 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 可以獲取運(yùn)行時(shí)類(lèi)型 所以const 和 volatile 運(yùn)行時(shí)不會(huì)有記錄柒凉,只有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