Инициализация агрегата класса std :: array

Я делаю небольшой вспомогательный класс, который происходит из std::array. Конструктор не наследует, очевидно, и это то, что отвечает за инициализацию скобки; например:

template<typename T, size_t size>
struct foo : std::array<T,size>
{
     foo(int a, int b)
     : std::array<T,size>{a,b}
     {
          //nothing goes here since constructor is just a dummy that 
          //forwards all arguments to std::array constructor
     }
}

int main()
{
     foo<int,2> myobj = {1,2}; //brace initialization calls custom constructor with inner elements as arguments
}

Количество аргументов должно соответствовать точно, поэтому я склоняюсь к использованию в конструкторе чего-то вроде аргумента вариационной функции (так как я не только собираюсь использовать 2 элемента в массив каждый раз). Используя это, как мне переслать пакет вариационных аргументов в конструктор std::array? Я открыт для других методов инициализации скобок, которые позволяют пересылать конструктору std::array.

Примечание: std::initializer_list требует инициализации во время выполнения, и я ищу способ компиляции time / constexpr. Спасибо.

1
задан 13 August 2018 в 15:29

1 ответ

Я не думаю, что наследование стандартного контейнера - хорошая идея.

В любом случае ...

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

Вы также можете сделать constexpr конструктором foo, чтобы вы могли сделать объекты constexpr foo.

На примере

#include <array>
#include <type_traits>

template <typename T, std::size_t S>
struct foo : public std::array<T, S>
 {
   template <typename ... As,
             typename std::enable_if<sizeof...(As) == S>::type * = nullptr>
   constexpr foo (As && ... as)
      : std::array<T, S>{ { std::forward<As>(as)... } }
    { }
 };

int main ()
 {
   //constexpr foo<int, 2u> myobj1 = {1}; // compilation error
   constexpr foo<int, 2u> myobj2 = {1, 2}; // compile
   //constexpr foo<int, 2u> myobj3 = {1, 2, 3}; // compilation error
 }
0
ответ дан 15 August 2018 в 17:03

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

Похожие вопросы: