Nano Hash - криптовалюты, майнинг, программирование

Получить ключевое слово enum по значению

У меня основной вопрос о перечислениях C ++.

Вот перечисление:

enum Names {
    Tim     =       0x1,
    Bob     =       0x2,
    Jim     =       0x4
};

Если я получаю значение (например, 0x4), я хотел бы напечатать соответствующее имя: Jim.

Есть способ сделать это? Что-то вроде Names.key(0x04)? Я знаю, что это существует в Java < / а>.

Спасибо

02.04.2013

  • «Я знаю, что это существует в Java», но Java - это язык с отражением, а C ++ - нет. Нет автоматического способа сделать это, вы должны делать работу сами. 02.04.2013
  • Примеры того, КАК сделать это самостоятельно, см. В stackoverflow.com/questions/6281461/enum-to-string- c 02.04.2013
  • Этот предыдущий поток дает вам массу вариантов stackoverflow.com/questions/3342726/ 02.04.2013

Ответы:


1

Как говорили многие, в ванильном C ++ это невозможно. Но если вы используете Qt, вы можете определять перечисления, которые зарегистрированы в метасистеме Qt, чтобы вы могли получать информацию перечисления во время выполнения.

Класс QMetaEnum предоставляет метаданные о перечислителе.

Используйте name () для имени счетчика. Ключи перечислителя (имена каждого пронумерованного элемента) возвращаются функцией key (); используйте keyCount (), чтобы найти количество ключей. isFlag () возвращает, предназначен ли перечислитель для использования в качестве флага, что означает, что его значения могут быть объединены с помощью оператора OR.

Функции преобразования keyToValue (), valueToKey (), keysToValue () и valueToKeys () позволяют выполнять преобразование между целочисленным представлением перечисления или заданного значения и его буквальным представлением. Функция scope () возвращает область видимости класса, в которой был объявлен перечислитель.

 class MyClass : public QObject
 {
     Q_OBJECT
     Q_ENUMS(Priority)

 public:
     MyClass(QObject *parent = 0);
     ~MyClass();

     enum Priority { High, Low, VeryHigh, VeryLow };
     void setPriority(Priority priority);
     Priority priority() const;
 };

Поскольку весь механизм использует метасистему Qt, вы можете использовать этот подход только для перечислений, членов производных классов QObject.

02.04.2013
  • Хорошо! Но я не могу построить QMetaEnum из базового enum, верно? 02.04.2013
  • Вы можете, но должны использовать макрос, чтобы зарегистрировать его в метасистеме. Но вам придется скомпилировать свой проект с этим, иначе получить доступ во время выполнения будет невозможно. Обновите мой ответ. 02.04.2013

  • 2

    Нет, не можешь. Это возможно в Java из-за отражения, функции, которой нет в C ++.

    Лучшее, что вы можете сделать, - это сохранить имена на карте:

    std::map<Names, std::string> names_string = {
        { Tim, "Tim"},
        { Bob, "Bob"}
        // .....
    };
    
    std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
    
    02.04.2013
  • Спасибо за ответ. Я не могу использовать карту, потому что это перечисление создается из COM-интерфейса. 02.04.2013

  • 3

    Нет, в C ++ это невозможно. Сначала составляются названия перечисления. Если вы хотите перейти к типу перечисления от целого числа, вы можете выполнить приведение.

    Аналогично, если бы у вас

    Foo foo = new Foo();
    String name = "John";
    int age = 23;
    

    В C ++ нет способа получить имена переменных.

    02.04.2013

    4

    Нет, это невозможно. Как и все идентификаторы в C ++, они больше не доступны во время выполнения. Может быть, карта или набор больше подходят для вашего случая использования, чем перечисление?

    02.04.2013

    5

    Напишите свою собственную функцию, чтобы справиться с этим ...

    enum Names {
        Tim     =       0x1,
        Bob     =       0x2,
        Jim     =       0x4
    };
    
    std::string GetNameString(int nName)
    {
        if( nName == Tim )
            return std::string("Bob");
        else if( nName == Bob )
            return std::string("Tim");
        else if( nName == Jim )
            return std::string("Jim");
    
        return std::string("");
    }
    
    02.04.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..