在以下示例中
template <typename T>
void foo() {
const char* name = typeid(T).name();
std::cout << name;
}
变量'name'将由类型'T' name初始化。如果我们需要打印此模板类型名称,这非常方便。但是,如果我们有别名:
using shortTypeName = std::smth::smth_else::smth_more;
在呼叫的结果中
foo<shortTypeName>();
将打印'std::smth::smth_else::smth_more'。我需要打印准确的别名,但不是它定义的类型。有人能给我一个建议吗,我该怎么做?
3条答案
按热度按时间vi4fp9gy1#
...别名标识符...
没有这样的东西,至少在编译之后没有。它只是语法上的糖衣,在最终的可执行文件中根本不存在。
获取类型的本地名称(与实现定义的和可能损坏的typeid名称相反)的 * 唯一 * 方法是使用stringize/stringify宏。
作为将来的参考,这最终应该是可能的,当Reflection TS的土地-但我还不知道是否期望它看起来像
reflexpr(T).get_name()
,或std::meta::name_of(^T)
,或其他东西了。btqmn9zl2#
有人能给予个建议吗,我该怎么做?
该语言不支持执行此操作的机制。
您所拥有的只是一个类型别名。
从http://en.cppreference.com/w/cpp/language/type_alias开始:
类型别名声明引入一个名称,该名称可用作由type-id表示的类型的同义词。它不引入新类型,也不能更改现有类型名称的含义。
agyaoht73#
不能。因为类型别名是透明的:它只是一个新类型的同义词,而不是一个新类型。作为一个实现细节,它甚至不会在类型系统中被损坏,因为它不是一个类型。
§7.1.3类型定义说明符[dcl.typedef]
1.[......]用typedef说明符声明的名称变成了typedef-name。typedef-name在语法上等同于关键字,并以第8条中描述的方式命名与标识符关联的类型。因此,typedef-name是另一个类型的同义词。typedef-name不像类声明那样引入新类型(9.1)或枚举声明执行。
无论如何,
typeid(T).name();
几乎是无用的。直到我们在C++中有了适当的自省,你才能求助于黑客来获得你想要的(宏,侵入式技术或外部代码生成器工具)。