В этом посте уже объясняется, почему добавление направляющих вычетов в пространстве имен 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? Есть ли другие варианты?