Какие у меня есть варианты добавления руководств по вычету для типов stl

В этом посте уже объясняется, как добавление руководств по дедукции в пространство имен 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 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам