模板相当于宏中的#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