2

Как инициализировать статический вектор-член в следующем классе из его аргументов шаблона? Другими словами, я хотел бы вставить все аргументы шаблона в my_vector_ до функции main(). Порядок аргументов также должен храниться в векторе.Инициализировать статический вектор аргументами шаблона

template <int... args> 
class MyClass { 
public: 
    MyClass(); 

private: 
    static vector<int> my_vector_; 
} 
+0

Вы хотите инициализировать вектор по умолчанию? –

+1

'std :: array' не будет лучшей идеей? –

ответ

4

Просто развернуть список параметров в список инициализаторов.

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 должен быть доступен для более чем одной единицы перевода (и, следовательно, представленной в заголовочном файле), это становится громоздким, однако. В этом случае я рекомендую вам использовать функцию.

Другой вариант - использовать функцию вместо этого. Это еще более полезно для не templateclass 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 не является проблемой.

+0

У меня было бы несколько экземпляров MyClass, и я уверен, что каждый раз получаю доступ к этому вектору. Поэтому я не хочу создавать и заполнять этот вектор каждый раз. – yuefengz

+0

Я согласен с тем, что std :: array лучше в моем случае. – yuefengz

+0

@Fake Переменная 'static' будет для этого прекрасной. Я просто выбирал часть «до« основной ». – 5gon12eder