在 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/