当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在编译时区分别名和实际类型?》经验,为你挑选了2个好方法。

我编写了一个模板函数,它可以使用任意数量的类型,并为底层架构和操作系统显示它们的大小.但是,该函数无法区分真实类型的别名,因此将其评估为真实类型.

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

func();

输出:

Unsigned int is 4 bytes.
Unsigned int is 4 bytes. 

但是,我希望输出像,

Unsigned int is 4 bytes.
size_t is an alias for unsigned int.

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

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



1> Mikel F..:

答案是你现在不能这样做.但是,有一个静态反思的提议:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html

在本文档中,他们提到了Operation get_base_name哪些将返回类型名称.然而他们说:

在meta :: Alias上调用的get_base_name返回别名,而不是别名声明的名称.

然后Operation get_aliased,它们提供,可用于在使用时获取原始类型的别名get_base_name.

文档中的示例代码:

 using rank_t = int;

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

产生以下输出:

 5:rank_t; 
 6:int;

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



2> Bathsheba..:

你运气不好

遗憾的是,如果类型是基本类型或基本类型的typedef,则无法在编译时或运行时区分.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有