模板相当于宏中的#var

时间:2015-08-16 16:08:34

标签: c++ macros

在C ++宏中,您可以使用PRINT_SIZE(bool); PRINT_SIZE(char); … 来获取传递的参数的文字字符串:

template <typename T>
void print_size() {
    std::cout << sizeof(T) << std::endl;
}

使用这个宏,我可以编写一个非常简单的程序,它会给我机器上特定类型的长度:

print_size<bool>();
print_size<char>();
…

这确实有效,但我想使用C ++模板。使用以下模板函数可以轻松获得大小:

"bool"

我可以用任何类型调用此函数,它将输出大小:

{{1}}

有没有什么方法可以从这里得到一个文字{{1}},以便输出与宏的输出一样好?

2 个答案:

答案 0 :(得分:2)

您可以使用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

请注意,它返回的名称取决于编译器,可能是该类型的一些不寻常的形式。更多信息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

答案 1 :(得分:2)

可以使用typeid:

使用RTTI(运行时类型推断)进行排序
        void TestEngine(object sender, SpeechRecognizedEventArgs e)
    {
        switch (e.Result.Text)
        {
          case "Test":
          //Label animation code goes here
          break;

输出:

#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;
}