Я делаю небольшой вспомогательный класс, который происходит из 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. Спасибо.
Я не думаю, что наследование стандартного контейнера - хорошая идея.
В любом случае ...
Вы можете использовать вариативные шаблоны, совершенную пересылку, а также 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
}