我编写了一个模板函数,它接受任意数量的类型,并为底层架构和操作系统显示它们的大小。但是,函数不能将别名与实类型区别开来,因此它的计算方法就好像它是实类型一样。
然而,我希望能够在编译时区分别名和内置类型,并根据它替换输出。
func<unsigned int, size_t>();输出:
Unsigned int is 4 bytes.
Unsigned int is 4 bytes. 但是,我希望输出结果像,
Unsigned int is 4 bytes.
size_t is an alias for unsigned int.当然,这要求编译器能够在编译时区分别名和内置类型。
那么,在任何C++版本中,是否有方法在编译时区分真实类型和别名?
发布于 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一起使用时,可以使用它获取别名的原始类型。
文档中的示例代码:
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。
发布于 2017-01-10 17:52:17
你运气不好。
可悲的是,在编译时或运行时,如果一个类型是一个原始类型,或者是一个原始类型的类型,那么就无法区分它。
https://stackoverflow.com/questions/41575002
复制相似问题