std::remove_extent 可以用来做啥?
Posted
技术标签:
【中文标题】std::remove_extent 可以用来做啥?【英文标题】:What can std::remove_extent be used for?std::remove_extent 可以用来做什么? 【发布时间】:2015-07-25 06:58:34 【问题描述】:我正在研究 C++11 提供的新功能,发现std::remove_extent。
typedef std::remove_extent<int[24]>::type A; // A is int
但是,除了通过从给定类型中删除维度来从现有类型定义新类型之外,我找不到此方法的用法。
谁能说明为什么 C++11 引入了这个特性?使用它有什么好处吗?
【问题讨论】:
为什么不搜索“remove_extent”?在 SO 上,有例如this answer 使用remove_extent
。
“我找不到这个的用法,除了......” - 你提到的就是这个的全部意义,所以你刚刚回答了你的问题。更具体地说,您要从中删除范围的类型可能隐藏在 typedef
后面,或者更常见的是模板参数。
【参考方案1】:
在 C++ 标准本身中有一个使用 std::remove_extent
的好例子。
创建智能指针对象std::unique_ptr
的模板函数
template <class T> unique_ptr<T> make_unique(size_t n);
返回以下表达式(20.8.1.4 unique_ptr 创建 p.#4)
unique_ptr<T>(new remove_extent_t<T>[n]())
考虑例如声明
auto p2 = std::make_unique<int[][10]>(2);
在这种情况下,make_unique 需要删除类型声明 int[][10]
中指定的维度,如 []
,并将其替换为 [2]
,从而在新表达式中获得 int[2][10]
。
【讨论】:
【参考方案2】:当您使用数组时,您可能需要获取数组包含的元素总数,包括子数组。这可以通过一些模板元编程来完成,通过使用std::extent
和std::rank
以及std::remove_extent
。
template <class T, std::size_t N = std::extent<T>::value >
struct total_elements
using M_type = typename std::remove_extent<T>::type;
static constexpr std::size_t value = N * total_elements< M_type >::value;
;
template <class T>
struct total_elements<T, 0> : std::integral_constant<std::size_t, 1> ;
Live example.
如果您使用vector
或vectors
,这可能特别有用,因为不能保证存储是连续的:通过给出元素总数和一维vector
,您将获得它。您还需要一些指针算法来使其表现得好像是多维的,但这很容易在类中抽象。
请注意,该标准并没有强制您使用它:如果您发现它可能有用的地方,那就去吧。
【讨论】:
以上是关于std::remove_extent 可以用来做啥?的主要内容,如果未能解决你的问题,请参考以下文章