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

时间:2017-01-10 17:40:25

标签: c++ c++14 alias

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

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

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 ++版本中,有没有办法在编译时区分真实类型和别名?

2 个答案:

答案 0 :(得分:6)

你运气不好。

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

答案 1 :(得分:6)

答案是你不能现在。但是,有一项静态反思提案: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<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 fork上有一个初步的实验性实现:https://github.com/matus-chochlik/clang/tree/reflexpr