c++11中的typeid(T).name()替换项
typeid(T).name() alternative in c++11?
在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实例化了类。但它也提供了用户定义的类型。
不是很花哨,但它有它的用途。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 如何用转义符替换字符串中的所有特殊字符
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在一个读写器队列中,我可以用volatile替换原子吗
- 用符号版本替换对函数的所有调用
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 替换基于地图的所有引用
- 按平均值替换数组中的元素
- C++中"dependent name"的定义是什么?
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 初始化 std::vector 替换为单大括号而不是双大括号
- 删除/替换C++字符串中的多字符 (ÿû)
- 将系数存储在头文件的数组中("does not name a type"错误)
- 将 malloc 替换为数组
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何在C++中用'\'替换''来处理转义序列?
- 为了对象替换的目的,究竟什么构成了对象的"name"?
- c++11中的typeid(T).name()替换项