C ++ 11: Как создать класс enum внутри класса, который ведет себя как подкласс?

Получил эту ошибку в Entity Framework 6 с этим кодом во время выполнения:

var fileEventsSum = db.ImportInformations.Sum(x => x.FileEvents)

Обновление от LeandroSoares:

Используйте это для одиночного исполнения:

var fileEventsSum = db.ImportInformations.Sum(x => (int?)x.FileEvents) ?? 0

Оригинал:

Изменен для этого, а затем он сработал:

var fileEventsSum = db.ImportInformations.Any() ? db.ImportInformations.Sum(x => x.FileEvents) : 0;
0
задан Dom05704 21 February 2019 в 10:33
поделиться

3 ответа

Правильный пример с использованием регистров и лучшего объяснения был бы лучше. Я предполагаю, что вы хотите переназначить одно имя регистра в другое. Предложение:

class Register {
public:
  enum class UserName {
    REG_IO0,
    REG_MEM1
  };
  enum class CPUName {
    REG_INT0,
    REG_INT1
  };
  void setMapping(UserName from, CPUName to); // store the mapping
  CPUName getMapping(UserName name) const; // retrieve the mapping
private:
  std::map<UserName, CPUName> m_registerMap;
};

Если вы хотите, вы можете реализовать методы get / set для регистров в этом классе, если вы храните индексы / адреса регистров. Используйте шаблоны или перегрузите их для разных типов данных.

0
ответ дан Bim 21 February 2019 в 10:33
поделиться

Вы не можете использовать enum class для достижения своей цели. Однако вы можете использовать namespace с набором жестко закодированных constexpr объектов:

struct Country 
{ 
    int _id; 
};

namespace Countries
{ 
    namespace Europe 
    {
        constexpr Country Italy{0};
        constexpr Country France{1};
    };
};

Использование:

myC.foo(Countries::Europe::Italy);
0
ответ дан Vittorio Romeo 21 February 2019 в 10:33
поделиться

Вы можете явно использовать тип enum в качестве аргумента функции или конструктора, ограничивая вызывающую сторону использованием этого перечисления. То, что вы не можете сделать тривиально, это объединить несколько определений перечислений так, как вы предлагали.

Вы можете написать несколько конструкторов, по одному для каждого из перечислений Европа, Азия и т. Д., Но это будет работать, особенно если у вас есть ряд функций, которые должны принимать эти перечисления в качестве аргументов.

- ИЛИ -

Вы можете определить одно большое перечисление и определить разделители с фиксированными значениями для каждой подгруппы, чтобы вы могли сравнить значение перечисления с этими защитными значениями, чтобы идентифицировать подгруппу. Вы потеряете подгруппу, если вы это сделаете. Вы могли бы использовать инициализаторы константного перечисления c ++ 11 для конструирования членов-значений перечисления в подклассах для каждого континента - но учтите, что они доступны только для enum class из c ++ 17 (поэтому я использую трюк с вложенным классом для предоставления пространства имен члена принудительное выполнение - в c ++ 17 вы могли бы иметь enum class Location - вы можете написать это в c ++ 11, но тогда вы не сможете выполнить инициализаторы const). Значения следуют приведенному выше правилу разделителей, но для получения имен вызывающие должны косвенно обращаться через подклассы.

class Country
{
  class Location {
    enum Value { 
      None =0,
      Europe = 0x0100,
      Asia =   0x0200,
      //etc
    };
  };

  struct Asia {
    const Location::Value Japan { Location::Asia + 1 };
    //etc
  };
  struct Europe {
    const Location::Value UnitedKingdom { Location::Europe + 1 };
    //etc
  };
  // etc
};

Тогда вы можете получить

class myClass {
public:
  myClass(Country::Location::Value v);
};

И позвонить с помощью

myClass instance(Country::Asia::Japan);

- ИЛИ -

Вы можете определить другой Структура, единственная цель которой состоит в том, чтобы взять различные перечисления и преобразовать их в пару значений для индекса континента и страны. Затем вы можете использовать эту структуру в качестве параметра функции и разрешить автоматическое преобразование из этой структуры. Это означает, что вы выполняете преобразование только один раз, и вызывающие к вашему коду не влияют. Вы можете использовать защитные диапазоны так, что вам не нужно явно хранить код континента, просто необработанный номер страны будет уникальным для всех ваших перечислений.

0
ответ дан Gem Taylor 21 February 2019 в 10:33
поделиться
Другие вопросы по тегам:

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