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

标签 c++ reflection c++11

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

最佳答案

不,但你可以做一个:

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

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

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)");
}

关于c++ - c++11 中的 typeid(T).name() 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004578/

相关文章:

c++ - 使用 Qt GUI 从所有可用的串口中选择

c++ - sigsegv 使用 vector STL

c++ - 如何在 QPushButton 悬停时设置高亮

c++ - lower_bound() 返回最后一个元素

C#,使用反射获取switch中的每个case名称

c# - 我在 Reflection.Emit.DynamicMethod 中发出的 IL 有什么问题?

c# - Type.GetProperties 方法

C++:需要从几个类似接口(interface)的类继承的参数类型

c++ - 缩小从无符号到 double 的转换

c++ - 哪种重载组合性能最高?