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

Discussion in 'LANGS.C' started by _DEN_, Mar 21, 2017.

  1. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Code (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

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
  3. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Rockphorr, спасибо, не заметил.
     
  4. SadKo

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

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Насколько помню, это решается рекурсивным вызовом шаблонов :facepalm:.
     
  5. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Blog Posts:
    0
    Joined:
    May 13, 2017
    Messages:
    97
    Code (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

    Blog Posts:
    0
    Joined:
    May 13, 2017
    Messages:
    97
    Небольшое исправление: просто b{Ints...} вместо b({Ints...})