Задать вопрос
old2ev
@old2ev
int main(){for(;;)fork();}

Можно ли в C++ передать в шаблонный параметр класса типа unsigned long размер инит-листа aka std::initializer_list::size() через конструктор?

Имеется класс следующего вида:
template <size_t size>
class A {
    Any_Type array[size];
public:
    //Тут может быть какой-либо шаблон...
    A(std::initializer_list<Any_Type> init_list) -> A</*Тут должен быть параметр для CTDA*/> {
       //Инициализация массива array данными из init_list
    }

};


По итогу это должно работать таким способом:
A a = {...};
То есть без явного указания размера типа.
Что я уже пробовал:
// Самый тупой вариант
A(std::initializer_list<Any_Type> init_list) -> A<init_list.size()> // Нет ибо init_list не существует во время компиляции и даже constexpr тут не поможет

A(std::initializer_list<Any_Type> init_list) -> A<std::initializer_list<Any_Type>::size()> // Разумеется потому что size не статик ф-ция

template<size_t count_elem>
A(Any_Type const (&arr)[count_elem]) -> StaticByteArray<count_elem> // Nope...

template<size_t count_elem>
A(Any_Type const (&arr)[count_elem]) -> StaticByteArray<sizeof (arr)> // Nope...

// Да это точно не вариант, ибо шаблон будет хватать любой мусор, но всё же...
template<typename T>
A(T arr) -> StaticByteArray<sizeof (arr)> // Хз почему но нет...


Может кто работал с этим
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Средний 3 комментария
Решения вопроса 2
template <size_t N>
class ArrayWrapper {
  MyType data_[N];

public:
  explicit ArrayWrapper(MyType (&&arr)[N]) : data_(std::move(arr)) {}
};

template <size_t N>
ArrayWrapper(MyType (&&arr)[N]) -> ArrayWrapper<N>;
Ответ написан
Комментировать
old2ev
@old2ev Автор вопроса
int main(){for(;;)fork();}
template <size_t size>
class A {
    Any_Type array[size];
public:

    template<size_t size>
    A(A<size>& other) {/*Инициализация массива array данными из other*/}

    template<size_t size>
    A(A<size>&& other) {/*Инициализация массива array данными из other*/}

    template<size_t size>
    A(const Any_Type (&&arr)[size]) {/*Инициализация массива array данными из arr*/}

};

template<size_t size>
A(A<size>& other) -> A<size>;

template<size_t size>
A(A<size>&& other) -> A<size>;

template<size_t size>
A(const Any_Type (&&arr)[size]) -> A<size>;

//......//

A a({1,2,3,4,5,6});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
А почему не сделать так?
template <class T>
class A {
   std::vector<T> array;
public:  
   A(std::initializer_list<T> init_list): array(init_list)
   {
   }
};
Ответ написан
Комментировать
maaGames
@maaGames
Погроммирую программы
Так "A a = {...};" написать точно не получится, потому что надо указывать тип шаблонного параметра. Т.е. в записи "A a" тип недоопределён.
Возможно, можно сделать аналог std::make_shared, который будет возвращать, напрмиер, A<5>. Что-то типа:
template< int Size>
A<Size> make_A( std::initializer_list<T> init_list )
{
      A<init_list .size()> a( init_list ); // size() - constexpr
      return a;
}

auto a = make_A( {...} );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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