Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
8 / 8 / 0
Регистрация: 16.07.2013
Сообщений: 149

Вывод перечисления в виде текста

26.05.2021, 11:31. Показов 6132. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Допустим, есть у меня перечисление:

Code
1
2
3
4
5
typedef enum  Enum {
  One
  Two
  Three
}
Есть в VC++ функция на манер:

Code
1
std::string str = ToString(Enum(1));
чтобы в результате получилось

Code
1
str = "Two"
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2021, 11:31
Ответы с готовыми решениями:

Вывод значения перечисления enum в консоль в форматированном виде
Как реализовать корректный вывод? Есть namespace Library { public enum Weather { Satisfactory, //...

Вывод текста с БД в виде ссылки
Помогите пожалуйста, как сделать .$row. чтобы текст который находиться в этом поле выводился как ссылка и при нажатии на нее открывало...

Вывод текста в виде таблицы
Существует ли какая либо константа для вывода текста в Label в виде таблицы. Т.е. она должна делать отступ наподобие Tab ворде. Например,...

20
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 10:45
Цитата Сообщение от MikeNew Посмотреть сообщение
Вывод перечисления в виде текста
без словаря никак:
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
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <map>
 
enum Enum
{
    Nine = 9,
    One  = 1,
    Two     ,
    None = 0
};
 
struct  What
{       What()
        {
            m[Nine] = "Nine";
            m[One ] = "One" ;
            m[Two ] = "Two" ;
 
            /// про None забыли.
        };
 
        std::string operator()(Enum e) const
        {   auto a = m.find(e);
            return std::to_string(e) + ": " + (a == m.end() ? "??" : a->second);
        }
 
private:
    std::map<Enum, std::string> m;
};
const What WHAT;
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{
    Enum                    my = Two;
    std::cout <<       WHAT(my) << '\n';
 
                            my = Nine;
    std::cout <<       WHAT(my) << '\n';
 
                            my = None;
    std::cout <<       WHAT(my) << '\n';
 
                            my = One;
    std::string  str = WHAT(my);
    std::cout << str  << '\n';
}
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 10:56
MikeNew, я чаще всего вот так борюсь

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
#include <string>
#include <iostream>
 
class some_class
{
public:
    enum class e_myenum
    {
        one,
        two,
    };
    friend std::string toString(const e_myenum& val)
    {
        std::string str;
        switch(val)
        {
            default:break;
            case e_myenum::one: str="one";break;
            case e_myenum::two: str="two";break;
        }
        return str;
    }
    friend void fromString(e_myenum& val,const std::string_view str)
    {
        val={};
        if(str.empty())return;
        if(str=="one"){val=e_myenum::one; return;}
        if(str=="two"){val=e_myenum::two; return;}
    }
};
 
 
int main()
{
    some_class::e_myenum value{};
    auto str=toString(value);
    
    some_class::e_myenum new_value{};
    fromString(new_value,str);
    
    std::cout<<str<<", comparing=="<<(value==new_value);
    
    return 0;
}
one, comparing==1
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 11:03
Цитата Сообщение от Алексей1153 Посмотреть сообщение
я чаще всего вот так борюсь
мапа, в который бинарный поиск, позволяет искать в среднем в N/(2*log2(N)) быстрее в отличии от свич-портянки.

да и код в разы лаконичнее, особенно для емких перечислений.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 11:11
XLAT, там искать то в таких объёмах . Мапа даст выигрыш, если строк будет, скажем, 100 и больше и при условии интенсивного использования. Да и то, нужно протестировать и замерить, чтобы доказать, что и 100 будет тормозить )

в общем, мапа тут не нужна, там одно только динамическое выделение памяти скорость съест (поправочка: оно там, само собой, не постоянное, а только при создании экземпляра)

Добавлено через 2 минуты
это всё было про сравнение строк. А насчёт свича - свич всегда быстрее любой мапы

Добавлено через 2 минуты
короче говоря, в общем случае (99.9%) тут можно именно в таком виде сделать.

А уж если за мапу браться, то тогда уж std::unordered_map
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 11:16
Алексей1153,
ну да я в курсе, что и пузырёк бывает быстрее квиксорта.
но ток не совсем мне понятно, почему народ так любит затачивать дизайнинг на хеллоуворлды ...

это был не вопрос.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 11:35
Цитата Сообщение от XLAT Посмотреть сообщение
почему народ так любит затачивать
а кто его знает - у него и спроси

Добавлено через 20 секунд
лично я - за упрощение

Добавлено через 14 минут
XLAT, вариант твоего варианта)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct  What
{
    inline static std::unordered_map<Enum, std::string> to
    {
        {Nine,"Nine"},
        {One ,"One"},
        {Two ,"Two"},
    };
    
    std::string operator()(const Enum e) const
    {
        if(auto a = to.find(e); a!=to.end()){return a->second;}
        return "??";
    }
};
1
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 11:47
Цитата Сообщение от Алексей1153 Посмотреть сообщение
лично я - за упрощение
с этим спорить невозможно.

НО ...
упрощение упрощению рознь.

упрощение через универсализм по мне реально РУЛИТ.
пример, те же обобщённые контейнеры из стандарта.

а в данном случае: единождное написание такой структуры, которая на все случаи с применением через слепую копипасту. Этот класс может быть и хитёр в написании, но тривиален в применении.


Типа так:

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
#include "myenum.h"
 
/// какой угодно енам:
enum Enum
{
    Nine = 9,
    One  = 1,
    Two     ,
    None = 0
};
 
const mylib::WHAT WHAT(
R"(
    Nine = 9,
    One  = 1,
    Two     ,
    None = 0
)"
);
 
/// если есть ещё енамы  то тут всё также аналогично тому, что выше
...
 
/// тут всё тоже самое, как выше.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 12:01
XLAT, пост №3 - это как раз для копипасты, там даже ошибиться сложно, потому что компилятор заругается, если тип не сменить, а при смене типа заругается на отсутствующие константы

Цитата Сообщение от XLAT Посмотреть сообщение
const mylib::WHAT WHAT(
R"(
    Nine = 9,
    One  = 1,
    Two     ,
    None = 0
)"
);
есть возможность инициализировать статический мап при помощи лямбды, внутри которой будет парс такой строки.
Но тут есть проблема - не всегда будут прописаны значения после = (обычно их там и не будет). Так что, ждём, когда уже в C++ подвезут рефлексию. В C++20 вроде ещё нету

Добавлено через 2 минуты
студия позволяет выделять с альтом прямоугольный блок текста и перемещать-копировать его. Поэтому в студии такие копипасты делаются в пару движений (ну ладно, не пару, а десять )
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 12:08
Цитата Сообщение от Алексей1153 Посмотреть сообщение
пост №3 - это как раз для копипасты
ага, для каждого енама копипастить класс + придумать ему название + а потом рыться у него внутрях ...
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 12:12
Цитата Сообщение от XLAT Посмотреть сообщение
для каждого енама ....придумать ему название
ээ, а как же иначе? Как им пользоваться, если нет имени ?

Добавлено через 1 минуту
можно и без оборачивающего класса, если ты о нём. Тогда функции надо сделать не friend, а inline (если располагается в заголовке)
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,120
01.06.2021, 12:14
Пользуюсь SDK одной фирмы. Для перевода в строку они делают макрос сразу за перечислением. В одном месте перечисление было очень длинным, на сотню констант или даже больше, там им пришлось заменить макрос на функцию. Примерно так это у них выглядит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
enum EMvPolarity
{
   keMvPolarityInvalid,                   // Invalid value.
   keMvPolarityFirstField,                // Indicates that the surface is a first field.
   keMvPolaritySecondField,               // Indicates that the surface is a second field.
   keMvPolarityInterlacedFieldsInAFrame,  // Indicates that the surface is a frame containing two interlaced fields.
   keMvPolarityProgressiveFrame,          // Indicates that the surface is a progressive frame.
   keMvPolarityBackToBackFieldsInAFrame,  // Indicates that the surface is a frame containing two back-to-back fields.
   keMvPolarityLast                       // End of list indicator.
};
// This macro is used to get the string of the enum value EMvPolarity.
#define MV_POLARITY_ENUM_TO_STRING(ePolarity) \
   ((ePolarity == keMvPolarityInvalid)                 ? ("Invalid") : \
   (ePolarity == keMvPolarityFirstField)               ? ("FirstField") : \
   (ePolarity == keMvPolaritySecondField)              ? ("SecondField") : \
   (ePolarity == keMvPolarityInterlacedFieldsInAFrame) ? ("InterlacedFieldsInAFrame") : \
   (ePolarity == keMvPolarityProgressiveFrame)         ? ("ProgressiveFrame") : \
   (ePolarity == keMvPolarityBackToBackFieldsInAFrame) ? ("BackToBackFieldsInAFrame") : \
   (ePolarity == keMvPolarityLast)                     ? ("Last") : \
   ("???"))
1
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 12:17
XLAT, можно и без оборачивающего класса, если ты о нём. Тогда функции надо сделать не friend, а inline (если располагается в заголовке)

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
#include <string>
#include <iostream>
 
enum class e_myenum
{
    one,
    two,
};
/*inline - если это расположено в *.h */ std::string toString(const e_myenum& val)
{
    std::string str;
    switch(val)
    {
        default:break;
        case e_myenum::one: str="one";break;
        case e_myenum::two: str="two";break;
    }
    return str;
}
/*inline - если это расположено в *.h */ void fromString(e_myenum& val,const std::string_view str)
{
    val={};
    if(str.empty())return;
    if(str=="one"){val=e_myenum::one; return;}
    if(str=="two"){val=e_myenum::two; return;}
}
 
int main()
{
    e_myenum value{};
    auto str=toString(value);
    
    e_myenum new_value{};
    fromString(new_value,str);
    
    std::cout<<str<<", comparing=="<<(value==new_value);
    
    return 0;
}
Добавлено через 2 минуты
Ygg, что-то мне подсказывает, что такой макрос сильно вдарит по времени компиляции )) Функция то лучше в этом плане, а городить всё равно столько же
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 13:07
Алексей1153,
ладно, выше я конеш немножко утрировал,
для такой задачи чтобы парсить это слишком,
хотя свой питонистый препроцессор на пребилде иметь это уже дело чести

и всё же в поддержку универсализма:
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
/// C++17
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <map>
 
template<typename T>
using ce_t = const std::initializer_list<std::pair<T, std::string>>;
 
#define LOAD(v) {v, #v}
 
template<typename T>
struct  What
{       What(ce_t<T> a) : m(a.begin(), a.end()){}
 
        std::string operator()(T e) const
        {   auto a = m.find(e);
            return std::to_string(e) + ": " + (a == m.end() ? "??" : a->second);
        }
 
private:
    const std::map<T, std::string> m;
};
 
///--------|
/// Enum1  |
///--------:
enum Enum1
{   Nine = 9,
    One  = 1
};
 
const What<Enum1> WHAT1(
{   LOAD(Nine),
    LOAD(One )
});
 
///--------|
/// Enum2  |
///--------:
enum Enum2
{   Two  = 2,
    None = 0
};
 
const What<Enum2> WHAT2(
{   LOAD(Two )
    /// про None забыли.
});
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{
    Enum1              my1 = One;
    std::cout << WHAT1(my1) << '\n';
 
    Enum2              my2 = Two;
    std::cout << WHAT2(my2) << '\n';
 
                       my2 = None;
    std::cout << WHAT2(my2) << '\n';
}
Добавлено через 16 минут
поправил очепятки ...
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 13:13
XLAT, а чем так удобнее, чем в посте №7 ? Да ещё и мап будет в каждом экземпляре WHAT создаваться. А вот статик не будет
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 13:28
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Да ещё и мап будет в каждом экземпляре WHAT создаваться
для разных енамов свои мапы, ну, как бы, очевидно.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
А вот статик не будет
разумеется, генерация словаря на этапе компиляции приветствуется,
но для меня щас лениво лезть в дизасм, чтобы проконтролировать этот момент.

законстантив всё что можно я надеюсь, что всё обойдётся: компил сам разрулит
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 13:45
а, так структура то не WHAT, а What . Короче, у меня стопудов проще и читается лучше ))

макросы я вообще не использую давно (кроме глобальных флагов компиляции)
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 13:56
Цитата Сообщение от Алексей1153 Посмотреть сообщение
у меня стопудов проще и читается лучше
когда вы юзаете opencv или какой-нить стандартный контейнер вы часто лезете во внутренний код библы,
чтобы его ПОЧИТАТЬ?

Цитата Сообщение от Алексей1153 Посмотреть сообщение
макросы я вообще не использую давно
в данном случае шаблоном заменить не удастся никак,
конечно, вы можете написать, что и шаблоны вы вообще не используете.

и всё же, подытожу: серебряной пули нет.

аминь.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,146
01.06.2021, 14:03
XLAT, это же не какая-то чужая библа, а свой код.

Шаблоном - вряд ли, а функция с перечислением строк - запросто и наглядно

Добавлено через 47 секунд
пуля будет с привозом рефлексии - весь этот топик будет в прошлом
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
01.06.2021, 14:13
Цитата Сообщение от Алексей1153 Посмотреть сообщение
пуля будет с привозом рефлексии
ещё не привезли, а крики об обшарпивании или обпитонивании крестов
за счёт скорости, простоты, той же наглядности и тп..
уже раздаются в шуме жмаканья кейсов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2021, 14:13
Помогаю со студенческими работами здесь

Вывод текста в 16м и 8м виде
..вывести числа в 16м 8м виде не проблема и.т.п Но я от столкнулся с проблемой ..надо помощь в программе которая выводит любой текст (в...

Вывод на экран в виде текста
Есть PHP файл без концевых тегов, например, $_POST = &quot;&quot;; if ($_SERVER == 'POST') { $Login = $_POST; $Password = $_POST; if...

Вывод текста в виде псевдо графики
Уважаемые форумчане подскажите как лучше при помощи псевдо графики вывести на экран сообщение &quot;С 8 марта!&quot; желательно в рамочке...

Вывод результата запроса в виде текста
Students-&gt;Query1-&gt;SQL-&gt;Text=&quot;select avg(OCENKA) from LIST&quot;; этот запрос типа float, его надо поместить в label.caption Добавлено...

Вывод текста в форме в виде списка
Здравствуйте! Работаю с формами и элементами упрваления и возник следующий вопрос. Мне для моей форму необходимо чтобы при нажатии кнопки в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru