Инициализация массива темплейтной длины

Тема в разделе "LANGS.C", создана пользователем _DEN_, 21 мар 2017.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (C++):
    1. class bar
    2. {
    3.     bar(int x);
    4.     // ...
    5. };
    6.  
    7. template <int N>
    8. struct foo
    9. {
    10.     bar b[N] = { 1, 2, 3, ..., N };
    11. }
    Как это проинициализировать? Хочется именно в классе. Вынос в отдельный init-метод и прочие костыли не интересуют.

    PS. Верните раздел про C++.
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Rockphorr, спасибо, не заметил.
     
  4. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Насколько помню, это решается рекурсивным вызовом шаблонов :facepalm:.
     
  5. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
    Код (C++):
    1.  
    2. #include <utility>
    3.  
    4. class bar { public: bar(int) {} };
    5.  
    6. template<int N>
    7. class foo
    8. {
    9.     bar b[N];
    10.  
    11.     template<int... Ints>
    12.     foo(std::integer_sequence<int, 0, Ints...>) : b({Ints...}) {}
    13. public:
    14.     foo() : foo(std::make_integer_sequence<int, N+1>{}) {}
    15. };
    16.  
     
  6. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
    Небольшое исправление: просто b{Ints...} вместо b({Ints...})