C ++ 11 Развлечения со списками инициализаторов, массивами и перечислениями

Справочная информация

Списки инициализаторов C ++ 11 могут использоваться для инициализации векторов и массивов с передачей аргументов конструкторам.

У меня есть фрагмент кода ниже, где я хотел бы инициализировать такой массив всеми перечислениями eCOLORS от eCOLORS :: First до eCOLORS :: Last с использованием списков инициализаторов.

Исходный код

Поскольку вся информация известна во время компиляции, я думаю, что есть способ решить эту проблему.

enum class eCOLORS 
{
    kBLUE=0, kGREEN, kRED, kPURPLE,
        First=kBLUE, Last=kPURPLE 
};

template< typename E >
size_t Size()
{
    return (size_t)(E::Last) - (size_t)(E::First) + 1;
}

struct Foo
{
    Foo( eCOLORS color ) { }
};

int main(int argc, char** argv)
{
    Foo a[2] = {
        { eCOLORS::kRED   },
        { eCOLORS::kGREEN }
    };  // works, but requires manual maintenance if I add another color

    /* how to feed v with all the enums from First to Last
       without hard-coding?
    Foo v[Size()] = {

    };
    */
}

Ugly Pseudo-Answer

Похоже, что все согласны с тем, что в настоящее время для этого нет никакого способа.

Я изначально хотел задать этот вопрос, я хочу автоматически создать массив объектов Foo, инициализация которых основана исключительно на перечисление eColors . Я хотел не требующее обслуживания решение, которое будет работать даже после добавления дополнительных записей в eColors .

Используя класс Enum из этого более раннего сообщения , я могу написать шаблон функции, который дает мне необходимую мне функциональность. Даже без использования этого класса Enum, вы все равно можете выполнить цикл от eCOLORS :: First к eCOLORS :: Last вместе с некоторыми уродливыми приведениями.

Мой уродливый псевдоответ непонятен (нигде так хорошо, как список инициализаторов времени компиляции), но, по крайней мере, это не требует обслуживания.

ПРИМЕЧАНИЕ: если появятся лучшие решения, я соответствующим образом обновлю OP.

template 
std::vector< T >
Initialize_With_Enums()
{
  std::vector< T > v;
  for( auto p : Enum() )
    v.push_back( T( p ));
  return v;
}

int main( int argc, char** argv )
{
  auto w = Initialize_With_Enum();
}
5
задан Community 23 May 2017 в 11:52
поделиться