c++11中的typeid(T).name()替换项

typeid(T).name() alternative in c++11?

本文关键字:name 替换 中的 typeid c++11      更新时间:2023-10-16

在c++11中,是否有一种标准的方法可以通过一些模板黑魔法或通过一些标准库函数动态获取类的名称?

没有,但您可以制作一个:

template<class T> struct meta {
    static const std::string& get_name() {return T::class_name;}
};

然后将静态成员CCD_ 1添加到类:

class MyClass {
public:
    static const std::string class_name("MyClass");
};

或专门化元:

template<> struct meta<int> { 
    static const std::string class_name("int");
    static const std::string& get_name() {return class_name;}
};

(这里有一个宏让这更容易)

#define specialize_meta(name) template<>struct meta<name>{static const std::string class_name(#name); static const std::string& get_name() {return class_name;} };
specialize_meta(double);

然后使用元模板:

int main() {
   std::cout << meta<int>::get_name();
}

如果真的想变得狡猾,你也可以为函数制作一个版本,但这些(显然)必须是专门的。

void foo(int) {} //function in question
template<class T, T& a> struct metafunc; //dont define generic.
template<decltype(foo), &foo> struct metafunc { //specialization
    static const std::string func_name("void foo(int)");
}

有一次我发现功能原型的漂亮打印非常有用:

在GCC中,PRETY_FUNCTION包含函数的类型签名及其裸名称。

例如,对于模板化的类或函数,您可以将类名扩展为C字符串:

template<typename T>
class Vector {
  void foo(int i) {
    cout << __PRETTY_FUNCTION__ << endl;
  }
};

这会给你一些类似的东西

void Vector<double>::foo(int)

如果您用例如doubles实例化了类。但它也提供了用户定义的类型。

不是很花哨,但它有它的用途。