Для чего можно использовать std:: remove extent?

Я изучаю новые функции, предоставляемые C++11, и я нашел std:: remove_extent.

typedef std::remove_extent<int[24]>::type A; // A is int

однако я не могу найти для этого использования, кроме определения нового типа из существующего типа путем удаления измерения из данного типа.

может ли кто-нибудь предположить, почему C++11 представил эту функцию? Есть ли какие-либо преимущества?

2 ответов


есть хороший пример использования std::remove_extent в самом стандарте C++.

функция шаблона, которая создает объект smart pointer std::unique_ptr

template <class T> unique_ptr<T> make_unique(size_t n);

возвращает следующее выражение (20.8.1.4 unique_ptr creation 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] в новом выражении.


когда вы работаете с массивами, вам может потребоваться получить общее количество элементов массива, включая суб-массивы. Это можно сделать с помощью некоторого метапрограммирования шаблонов, используя 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> {};

видео.

это может быть особенно полезно, если вы работаете с vector of vectors потому что хранение не гарантировано, чтобы быть непрерывным: давая общее количество элементов и 1D vector, вы получите это. Вам также понадобится некоторая арифметика указателя, чтобы она вела себя как многомерная, но это легко абстрагировать в классе.


как Примечание, стандарт не обязывает вас использовать его: если вы найдете место, где он может быть полезен, то идите за ним.