std rank extent

1、rank

//The rank of an array type is its number of dimensions. For other types is zero.
实现方式
通过integral_constant递归的展开数组的一个维度获取最终结果。

性能开销
模版推导过程都是在编译阶段完成,不涉及运行时开销。

调用stl内容
std integral_constant

//The rank of an array type is its number of dimensions. For other types is zero.
/// rank
template<typename>
struct rank
  : public integral_constant<std::size_t, 0> { };

template<typename _Tp, std::size_t _Size>
struct rank<_Tp[_Size]>
  : public integral_constant < std::size_t, 1 + rank<_Tp>::value > { };

template<typename _Tp>
struct rank<_Tp[]>
  : public integral_constant < std::size_t, 1 + rank<_Tp>::value > { };

代码示例

代码源地址:http://www.cplusplus.com/reference/type_traits/rank/

// array rank example
#include <iostream>
#include <type_traits>

int main() {
  std::cout << "rank:" << std::endl;
  std::cout << "int: " << std::rank<int>::value << std::endl;
  std::cout << "int[]: " << std::rank<int[]>::value << std::endl;
  std::cout << "int[][10]: " << std::rank<int[][10]>::value << std::endl;
  std::cout << "int[10][10]: " << std::rank<int[10][10]>::value << std::endl;
  return 0;
}
Possible output:
rank:
int: 0
int[]: 1
int[][10]: 2
int[10][10]: 2

应用场景

The rank of an array type is its number of dimensions. For other types is zero.

2、extent

Trait class to obtain the extent of the Ith dimension of type T.

实现方式
通过integral_constant完成具体数值的获取,通过递归调用获取到相应的一个维度的值。

性能开销
模版推导过程都是在编译阶段完成,不涉及运行时开销。

调用stl内容
std integral_constant

/// extent
template<typename, unsigned _Uint>
struct extent
  : public integral_constant<std::size_t, 0> { };

template<typename _Tp, unsigned _Uint, std::size_t _Size>
struct extent<_Tp[_Size], _Uint>
  : public integral_constant < std::size_t,
    _Uint == 0 ? _Size : extent < _Tp,
    _Uint - 1 >::value >
{ };

template<typename _Tp, unsigned _Uint>
struct extent<_Tp[], _Uint>
  : public integral_constant < std::size_t,
    _Uint == 0 ? 0 : extent < _Tp,
    _Uint - 1 >::value >
{ };

代码示例

代码源地址:http://www.cplusplus.com/reference/type_traits/extent/

// array rank/extent example
#include <iostream>
#include <type_traits>

int main() {
  typedef int mytype[][24][60];
  std::cout << "mytype array (int[][24][60]):" << std::endl;
  std::cout << "rank: " << std::rank<mytype>::value << std::endl;
  std::cout << "extent (0th dimension): " << std::extent<mytype,0>::value << std::endl;
  std::cout << "extent (1st dimension): " << std::extent<mytype,1>::value << std::endl;
  std::cout << "extent (2nd dimension): " << std::extent<mytype,2>::value << std::endl;
  std::cout << "extent (3rd dimension): " << std::extent<mytype,3>::value << std::endl;
  return 0;
}
Possible output:
mytype array (int[][24][60]):
rank: 3
extent (0th dimension): 0
extent (1st dimension): 24
extent (2nd dimension): 60
extent (3rd dimension): 0

应用场景

Trait class to obtain the extent of the Ith dimension of type T.

参考:gcc8源码

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,616评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,279评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,124评论 2 7