首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编译时区分别名和实数类型?

在编译时区分别名和实数类型?
EN

Stack Overflow用户
提问于 2017-01-10 17:40:25
回答 2查看 488关注 0票数 6

我编写了一个模板函数,它接受任意数量的类型,并为底层架构和操作系统显示它们的大小。但是,函数不能将别名与实类型区别开来,因此它的计算方法就好像它是实类型一样。

然而,我希望能够在编译时区分别名和内置类型,并根据它替换输出。

代码语言:javascript
复制
func<unsigned int, size_t>();

输出:

代码语言:javascript
复制
Unsigned int is 4 bytes.
Unsigned int is 4 bytes. 

但是,我希望输出结果像,

代码语言:javascript
复制
Unsigned int is 4 bytes.
size_t is an alias for unsigned int.

当然,这要求编译器能够在编译时区分别名和内置类型。

那么,在任何C++版本中,是否有方法在编译时区分真实类型和别名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-10 18:43:59

答案是你现在不能这么做,。然而,有一个关于静态反射的建议:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html

在本文档中,他们提到了Operation get_base_name,它将返回类型名称。然而,它们指出:

对meta::get_base_name调用的别名返回别名名称,而不是别名声明的名称。

然后,它们提供Operation get_aliased,当与get_base_name一起使用时,可以使用它获取别名的原始类型。

文档中的示例代码:

代码语言:javascript
复制
 using rank_t = int;

 using mR = reflexpr(rank_t); 
 cout << "5:" << get_base_name_v<mR> << endl; 
 cout << "6:" << get_base_name_v<get_aliased_m<mR>> << endl;

产生以下输出: 5:rank_t;6:int;

奖励:如果您现在有兴趣尝试这一点,下面的文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0385r1.pdf提到在GitHub上的clang叉上有一个初步的实验性实现,这里是:https://github.com/matus-chochlik/clang/tree/reflexpr

票数 6
EN

Stack Overflow用户

发布于 2017-01-10 17:52:17

你运气不好。

可悲的是,在编译时或运行时,如果一个类型是一个原始类型,或者是一个原始类型的类型,那么就无法区分它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41575002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档