Просто развернуть список параметров в список инициализаторов.
my_vector_ {args...};
Однако, вы уверены, что действительно хотите это сделать? Если вы не собираетесь добавлять/удалять элементы во время выполнения, вам не потребуется динамическое хранилище и в равной степени можно использовать std::array
.
Обратите внимание, что вы не можете инициализировать элемент данных static
нелитерального типа внутри определения class
. Если у вас есть только одна единица компиляции (потому что template
определен в исходном файле), вы можете это сделать.
#include <array>
#include <iostream>
template <int... Args>
struct example
{
// inline declaration
static const std::array<int, sizeof...(Args)> numbers;
};
// outline definition and initialization
template <int... Args>
const std::array<int, sizeof...(Args)> example<Args...>::numbers = {{Args...}};
int
main()
{
std::cout << example<14, 92>::numbers[0] << std::endl;
}
Если template
должен быть доступен для более чем одной единицы перевода (и, следовательно, представленной в заголовочном файле), это становится громоздким, однако. В этом случае я рекомендую вам использовать функцию.
Другой вариант - использовать функцию вместо этого. Это еще более полезно для не template
class
es, где определение определения в файле заголовка, как показано выше, может привести к нарушению правила определения (ODR) .
#include <array>
#include <iostream>
template <int... Args>
struct example
{
static const std::array<int, sizeof...(Args)>&
numbers() noexcept
{
static const std::array<int, sizeof...(Args)> thenumbers = {{Args...}};
return thenumbers;
}
};
int
main()
{
std::cout << example<14, 92>::numbers()[0] << std::endl;
}
На самом деле, я рекомендую вам сделать это в любом случае, потому что я нахожу это проще, даже если нарушения ODR не является проблемой.
Вы хотите инициализировать вектор по умолчанию? –
'std :: array' не будет лучшей идеей? –