c ++ 11中的typeid(T).name()替代?

Lor*_*one 4 c++ reflection c++11

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

Moo*_*uck 7

不,但你可以做一个:

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

然后将静态成员添加class_name到类中:

class MyClass {
public:
    static const std::string class_name("MyClass");
};
Run Code Online (Sandbox Code Playgroud)

或者专门化meta:

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

(这是一个让这更容易的宏)

#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);
Run Code Online (Sandbox Code Playgroud)

然后使用元模板:

int main() {
   std::cout << meta<int>::get_name();
}
Run Code Online (Sandbox Code Playgroud)

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

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)");
}
Run Code Online (Sandbox Code Playgroud)


rit*_*ter 5

一旦我发现函数原型的漂亮打印非常有用:

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

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

template<typename T>
class Vector {
  void foo(int i) {
    cout << __PRETTY_FUNCTION__ << endl;
  }
};
Run Code Online (Sandbox Code Playgroud)

这会给你类似的东西

void Vector<double>::foo(int)
Run Code Online (Sandbox Code Playgroud)

如果你用例如双打实例化了这个类.但它也为您提供了用户定义的类型.

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

  • `__PRETTY_FUNCTION__`是GCC的扩展. (5认同)