1仿滔、實(shí)現(xiàn)
/// is_array
template<typename>
struct is_array
: public false_type { };
template<typename _Tp, std::size_t _Size>
struct is_array<_Tp[_Size]>
: public true_type { };
template<typename _Tp>
struct is_array<_Tp[]>
: public true_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::is_array;
void test_is_array() {
is_array<int[]> i_no_size;
is_array<int[16]> is_size_16;
is_array<int> is_not_size;
is_array<int[]>::value_type i_no_size_value = is_array<int[]>::value;
is_array<int[16]>::value_type is_size_16_value = is_array<int[16]>::value;
is_array<int>::value_type is_not_size_value = is_array<int>::value;
cout << "i_no_size_value:" << i_no_size_value << endl;
cout << "is_size_16_value:" << is_size_16_value << endl;
cout << "is_not_size_value:" << is_not_size_value << endl;
printf_type_info("i_no_size", typeid(i_no_size).name());
printf_type_info("is_size_16", typeid(is_size_16).name());
printf_type_info("is_not_size", typeid(is_not_size).name());
printf_type_info("i_no_size_value", typeid(i_no_size_value).name());
printf_type_info("is_size_16_value", typeid(is_size_16_value).name());
printf_type_info("is_not_size_value", typeid(is_not_size_value).name());
int del_int;
int del_int_array[]{1,2,3};
int del_int_array_32[32];
decltype(del_int) del_int_variable;
decltype(del_int_array) del_int_array_variable;
decltype(del_int_array_32) del_int_array_32_variable;
is_array<decltype(del_int)> del_int_is_array;
is_array<decltype(del_int_array)> del_int_array_is_array;
is_array<decltype(del_int_array_32)> del_int_array_32_is_array;
printf_type_info("del_int_is_array", typeid(del_int_is_array).name());
printf_type_info("del_int_array_is_array", typeid(del_int_array_is_array).name());
printf_type_info("del_int_array_32_is_array", typeid(del_int_array_32_is_array).name());
}
int main() {
test_is_array();
return 0;
}
輸出
[is_array]$ ./test
i_no_size_value:1
is_size_16_value:1
is_not_size_value:0
i_no_size: std::is_array<int []>
is_size_16: std::is_array<int [16]>
is_not_size: std::is_array<int>
i_no_size_value: bool
is_size_16_value: bool
is_not_size_value: bool
del_int_is_array: std::is_array<int>
del_int_array_is_array: std::is_array<int [3]>
del_int_array_32_is_array: std::is_array<int [32]>