Вы можете явно использовать тип 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);
- ИЛИ -
Вы можете определить другоеСтруктура, единственная цель которой состоит в том, чтобы взять различные перечисления и преобразовать их в пару значений для индекса континента и страны.Затем вы можете использовать эту структуру в качестве параметра функции и разрешить автоматическое преобразование из этой структуры.Это означает, что вы выполняете преобразование только один раз, и вызывающие к вашему коду не влияютВы можете использовать защитные диапазоны так, чтобы вам не нужно было явно хранить код континента, просто необработанный номер страны был бы уникальным для всех ваших перечислений.