Каковы мои варианты для добавления руководств по выводам для типов STL - PullRequest
3 голосов
/ 28 января 2020

В этом посте уже объясняется, почему добавление направляющих вычетов в пространстве имен std не определено.
Теперь я действительно хотел бы сделать следующее:

namespace std { // undefined behavior
template <class... U>
array(char const*, U...) -> array<string, 1 + sizeof...(U)>;
}

Итак, это это то, что я пробовал:

template <typename T, std::size_t N>
struct array : std::array<T, N> {};

template <class... U>
array(char const*, U...) -> array<std::string, 1 + sizeof...(U)>;

template <typename T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;

И это работает

auto const arr = array{ "hello", "world" };
// array<std::string, 2ul>

Мой вопрос сейчас:
Q: Это мой единственный вариант для добавить руководство по выводу для типов STL? Есть ли другие варианты?

1 Ответ

2 голосов
/ 28 января 2020

Это моя единственная опция для добавления руководств по выводам для типов stl?

Да - в том смысле, что вы не добавляли руководство по выводу для типа в стандартной библиотеке, а добавляли руководство по выводу для вашего собственного типа (который наследуется от стандартного тип библиотеки). Вы всегда можете добавить направляющие вычеты к своим собственным типам.

Есть ли другие варианты?

Это не имеет для использования CTAD. Вы также можете написать функцию:

auto const arr = make_array("hello", "world");

Так, чтобы make_array давал std::array<T, N>, где T - это упавший тип первого элемента или, если этот тип char const*, string вместо.

...