Частичное выведение аргумента шаблона или обходной путь для std :: array? - PullRequest
0 голосов
/ 10 января 2019

C ++ 17 позволяет нам выводить аргументы шаблона std::array. Например, я могу написать

std::array ints = { 1, 2, 3 };

и ints будут иметь тип std::array<int, 3>.

Мой вопрос таков: что, если я хотел бы указать только аргумент типа массива, но автоматически определить размер массива?

Следующее не работает, так как кажется, что должны быть указаны все аргументы шаблона:

std::array<size_t> sizes = { 1, 2, 3 };

Мой компилятор жалуется и говорит: 'std :: array': слишком мало аргументов шаблона .

Возможно ли, чтобы размер массива определялся автоматически путем вывода аргумента шаблона? Если нет, возможно ли создать массив, указав только его тип, но не его размер?

1 Ответ

0 голосов
/ 10 января 2019

Насколько я знаю, это невозможно сделать. Но вспомогательный метод делает свое дело:

template<typename Type, typename ... T>
constexpr auto makeArray(T&&... t) -> std::array<Type, sizeof...(T)>
{
    return {{std::forward<T>(t)...}};
}

Пример использования:

const auto container = makeArray<double>(-5.0, 0.0, 5.0, 10.0);
...