Использование перечислений для проверки типов - как правильно охватить - PullRequest
1 голос
/ 05 мая 2011

У меня есть смесь классов C ++, некоторые из которых хранят переменную состояния 0..9 как целое число, другие используют '0' ... '9'.В настоящее время я делаю:

enum { kOne = '1' };
class StoresValueAsInt {
    static int value;  // contains 0 ... 9
};
class StoresValueAsChar {
    static char value; // contains '0' ... '9'
};
class StoresValueAsChar {
    static char value;
};

template <typename X>
isOne() { return X::value == kOne; }

Это позволяет мне написать код ошибки isOne<StoresValueAsInt::value>().Вместо этого я хотел бы, чтобы компилятор жаловался на это неправильное использование.Я попробовал следующее:

enum ValueInt {
    kOne = 1
};
enum ValueChar {
    kOne = '1'
};

class StoresValueAsInt {
    static ValueInt value;
};
class StoresValueAsChar {
    static ValueChar value;
};
class StoresValueAsChar2 {
    static ValueChar value;
};

Однако это не работает, потому что kOne виден на уровне пространства имен, и, следовательно, имеет конфликтующие объявления kOne.не объявлены ли перечисления в пространстве имен?Или лучший подход здесь?

обновлено: Добавлено то, что я сейчас делаю;в надежде уточнить мой вариант использования.

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Что касается лучшей практики, я действительно не уверен, чего вы пытаетесь достичь, поэтому я не могу указать вам правильное направление.

Однако, чтобы ответить на ваш вопрос напрямую: РазмещениеПеречисления в отдельных пространствах имен решат вашу проблему:

namespace IntVals {
   enum ValueInt {
      kOne = 1
   };
}
namespace CharVals {
   enum ValueChar {
      kOne = '1'
   };
}

class StoresValueAsInt {
   static ValueInt value;
};
class StoresValueAsChar {
   static ValueChar value;
};

Тогда вы сможете использовать следующее:

StoresValueAsInt::value == CharVals::kOne

Хотя это уродливо, и мне хотелось бы лучше понять, что высобирались предложить более элегантное решение, чем это.

1 голос
/ 06 мая 2011

Есть ли способ не объявлять перечисления в пространстве имен? Или лучший подход здесь?

Да, вы можете различать свои перечисления, как показано ниже:

struct ValueInt {
  enum {  // no need to have enum Name
    kOne = 1
  };
};
struct ValueChar {
  enum {  // no need to have enum Name
    kOne = '1'
  };
};

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

ValueInt::kOne;
ValueChar::kOne;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...