я могу написать пользовательское правило вычета для массива в вектор? - PullRequest
4 голосов
/ 06 июня 2019

возможно ли продлить правила удержания в стандартном стандарте?

#include <vector>
#include <array>

namespace std {
template< class T, size_t N >
vector(array<T, N>&) -> vector<T>;
}

int main() {

    std::array a = {2,3,5,7}; // array<int, 4> !

    std::vector w(a); 
}

g ++ 10.0 (wandbox), похоже, игнорирует мою версию.

в соответствии с clang9.0 (также Wandbox) предопределенным правилом liv в скрытом пространстве: ошибка: руководство по выводу должно быть объявлено в той же области видимости, что и шаблон 'std :: __ 1 :: vector'

1 Ответ

7 голосов
/ 06 июня 2019

Нет, вам не разрешено это делать. Помещение вещи в пространство имен std разрешено только в очень редких случаях, например шаблонные специализации std::hash например. В вашем случае вы можете использовать вывод аргумента шаблона класса с немного большим набором текста, чем нужно:

std::array a = {2,3,5,7};

std::vector w(a.cbegin(), a.cend());

Обратите внимание, что скобки имеют решающее значение для инициализации w, замена их фигурными скобками выводит что-то совсем другое.

Вы также можете выделить вышеприведенный вызов конструктора в отдельный вспомогательный шаблон:

template <class T, std::size_t N>
auto toVec(const std::array<T, N> a)
{
   return std::vector(a.cbegin(), a.cend());
}

, который допускает инициализацию как

std::vector w = toVec(a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...