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::extentstd::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.

如果您使用vectorvectors,这可能特别有用,因为不能保证存储是连续的:通过给出元素总数和一维vector,您将获得它。您还需要一些指针算法来使其表现得好像是多维的,但这很容易在类中抽象。


请注意,该标准并没有强制您使用它:如果您发现它可能有用的地方,那就去吧。

【讨论】:

以上是关于std::remove_extent 可以用来做啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python的框架可以用来做啥

ASP在Scripting.Dictionary对象可以用来做啥

“开发人员有效负载”的目的是啥?它可以用来做啥?

PLSQL Developer一般用来做啥呢

JAVA枚举可以用来做啥?举一个简单的例子(用枚举、不用)

Hadoop可以用来做啥