模板相当于宏中的#var
Template equivalent of #var in macro
在 C++ 宏中,您可以使用 #var
获取传递的参数的文字字符串:
#define PRINT_SIZE(type) \
(std::cout << sizeof(type) << " " << #type << std::endl)
使用这个宏,我可以编写一个非常简单的程序,它将在我的机器上给出特定类型的长度:
PRINT_SIZE(bool);
PRINT_SIZE(char);
…
这确实有效,但我想改用 C++ 模板。使用以下模板函数很容易获得大小:
template <typename T>
void print_size() {
std::cout << sizeof(T) << std::endl;
}
我可以用任何类型调用这个函数,它会输出大小:
print_size<bool>();
print_size<char>();
…
有什么方法可以让我从任何地方得到文字 "bool"
,这样输出就和带有宏的输出一样好吗?
您可以使用 typeid()
,如:
int i;
cout << typeid(i).name(); // Most likely will print int but g++ prints i
cout << typeid(int).name(); // Also most likely will print int but g++ prints i
请注意,它的名称 returns 取决于编译器,并且可能是某种不常见的类型形式。更多信息 here.
编辑:
g++ (4.8) 只打印基本类型的首字母。对于用户定义的 类,它打印名称中的字符数,后跟名称。例如:
#include <iostream>
#include <typeinfo>
class myclass
{
myclass() {}
};
class my
{
my() {}
};
int main()
{
std::cout << typeid(int).name() << std::endl;
std::cout << typeid(bool).name() << std::endl;
std::cout << typeid(myclass).name() << std::endl;
std::cout << typeid(my).name() << std::endl;
}
产生以下输出:
i
b
7myclass
2my
可以使用 RTTI(运行时类型推断)使用 typeid 来完成:
#include <iostream>
#include <typeinfo>
template <typename T>
void print_size() {
T a;
std::cout << typeid(a).name() << ": " << sizeof(T) << std::endl;
}
int main(){
print_size<bool>();
print_size<char>();
print_size<long>();
return 0;
}
这输出:
b: 1
c: 1
l: 8
在 C++ 宏中,您可以使用 #var
获取传递的参数的文字字符串:
#define PRINT_SIZE(type) \
(std::cout << sizeof(type) << " " << #type << std::endl)
使用这个宏,我可以编写一个非常简单的程序,它将在我的机器上给出特定类型的长度:
PRINT_SIZE(bool);
PRINT_SIZE(char);
…
这确实有效,但我想改用 C++ 模板。使用以下模板函数很容易获得大小:
template <typename T>
void print_size() {
std::cout << sizeof(T) << std::endl;
}
我可以用任何类型调用这个函数,它会输出大小:
print_size<bool>();
print_size<char>();
…
有什么方法可以让我从任何地方得到文字 "bool"
,这样输出就和带有宏的输出一样好吗?
您可以使用 typeid()
,如:
int i;
cout << typeid(i).name(); // Most likely will print int but g++ prints i
cout << typeid(int).name(); // Also most likely will print int but g++ prints i
请注意,它的名称 returns 取决于编译器,并且可能是某种不常见的类型形式。更多信息 here.
编辑:
g++ (4.8) 只打印基本类型的首字母。对于用户定义的 类,它打印名称中的字符数,后跟名称。例如:
#include <iostream>
#include <typeinfo>
class myclass
{
myclass() {}
};
class my
{
my() {}
};
int main()
{
std::cout << typeid(int).name() << std::endl;
std::cout << typeid(bool).name() << std::endl;
std::cout << typeid(myclass).name() << std::endl;
std::cout << typeid(my).name() << std::endl;
}
产生以下输出:
i
b
7myclass
2my
可以使用 RTTI(运行时类型推断)使用 typeid 来完成:
#include <iostream>
#include <typeinfo>
template <typename T>
void print_size() {
T a;
std::cout << typeid(a).name() << ": " << sizeof(T) << std::endl;
}
int main(){
print_size<bool>();
print_size<char>();
print_size<long>();
return 0;
}
这输出:
b: 1
c: 1
l: 8