Форум программистов, компьютерный форум CyberForum.ru

Диапазоны значений перечислителей - C++

Восстановить пароль Регистрация
 
Gleb4uk
2 / 2 / 0
Регистрация: 08.08.2012
Сообщений: 57
23.03.2013, 17:36     Диапазоны значений перечислителей #1
Доброго времени суток, уважаемые форумчане!
Для чего нужны диапазоны значений перечислителей, если самим перечислителям соответствуют только те значения, которыми они инициализированы при объявлении? Поначалу, когда я читал, упустил этот момент и подумал, что на перечислитель будет указывать любое значение его диапазона, тогда полезность его очевидна (особенно при выборе диапазонов с ипользованием switch). Но при реальных обстоятельствах - зачем нужны диапазоны?

И сразу ещё один вопросик - как получить имя перечислителя в виде строки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2013, 17:36     Диапазоны значений перечислителей
Посмотрите здесь:

C++ Как программно определить диапазоны базовых типов?
C++ Вычислить значение заданной функци на данном интервале с заданным шагом. Осуществить вывод значений аргумента и результатов вычислений значений функ
Определить наибольшее из всех отрицательных значений, наибольшее из всех значений, количество нулевых значений C++
C++ Вычислить и напечатать таблицу значений V для десяти различных значений радиусов R1, R2, ..., R10 трубы
C++ Переделать код так, чтобы использовались диапазоны значений с помощью указателей
C++ Обновление значений
Вычисление значений (С++) C++
C++ Вычисление таблицы значений заданной функции для N значений X в заданном интервале

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.03.2013, 11:01     Диапазоны значений перечислителей #2
Цитата Сообщение от Gleb4uk Посмотреть сообщение
Для чего нужны диапазоны значений перечислителей,
Есть целочисленный тип, на котором базируется тип перечисления. Он, по сути, и задает диапазон.
Цитата Сообщение от Gleb4uk Посмотреть сообщение
как получить имя перечислителя в виде строки
В C++ никак, если сами об этом не позаботитесь. В .Net языках (C++/CLI например) можно использовать рефлексию.
P.S. Вообще, для Ваших вопросов не помешали бы примеры.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.03.2013, 12:07     Диапазоны значений перечислителей #3
Можно намутить свой макрос для маппинга между значением-строкой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <boost/bimap.hpp>
 
template<typename E>
class enums_helper
{
   typedef boost::bimaps::bimap<std::string, boost::bimaps::set_of<E>> map_t;
   typedef typename map_t::value_type value_type;
public:
   enums_helper& operator () (const E& e, const std::string& name)
   {
      if (!members.insert(value_type(name, e)).second)
      {
         throw std::logic_error("Not unique");
      }
      return *this;
   }
   const E& operator [](const std::string& name) const
   {
      return get(name);
   }
   const std::string& operator [](const E& e) const
   {
      return get(e);
   }
private:
   const E& get (const std::string& name) const
   {
      auto pos = members.left.find(name);
      if (pos == members.left.end())
      {
         throw std::logic_error("Not found by name");
      }
      return pos->second;
   }
   const std::string& get(const E& e) const
   {
      auto pos = members.right.find(e);
      if (pos == members.right.end())
      {
         throw std::logic_error("Not found by value");
      }
      return pos->second;
   }
   map_t members;
};
 
#define MakeName2(x, y) x ## y
 
#define ENUM_NAMES_DECL(Enum) \
const Enum& get_by_name(const std::string&); \
const std::string& get_by_value(const Enum&);
 
#define ENUM_NAMES_BEGIN(Enum) \
static const enums_helper<Enum> MakeName2(names, Enum) = enums_helper<Enum>()
 
#define ENUM_NAMES_END(Enum) ; \
const Enum& get_by_name(const std::string& name) { return MakeName2(names, Enum)[name]; } \
const std::string& get_by_value(const Enum& e) { return MakeName2(names, Enum)[e]; }
 
enum E
{
   first,
   second
};
 
ENUM_NAMES_DECL(E)
ENUM_NAMES_BEGIN(E)
(first, "first")
(second, "second")
ENUM_NAMES_END(E)
 
int main()
{
   std::cout << get_by_name("first") << std::endl;
   std::cout << get_by_value(second) << std::endl;
}
http://liveworkspace.org/code/3kiySP$0
Yandex
Объявления
25.03.2013, 12:07     Диапазоны значений перечислителей
Ответ Создать тему
Опции темы

Текущее время: 09:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru