Эквивалент Enum для строк - PullRequest
       1

Эквивалент Enum для строк

1 голос
/ 10 августа 2011

Я изучал перечисления, которые ожидают только целочисленные входные данные и возвращают ему соответствующее значение. Я хочу добиться того же, но у меня есть только строки в качестве входных данных. Я хочу сделать следующую работу -

enum Types {
"Absolute", //"abs"
"PURE", //"PRE"
"MIXED" //"MXD"
}

и вероятный статус может быть -

string sTpes = Types("abs"); //this should return "Absolute"

или

string sTpes = Types("MXD"); //this should return "MIXED"

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 10 августа 2011

Строковых перечислений нет, но для сопоставления одного значения другому можно использовать std::map, который является стандартным шаблоном, поставляемым с платформами C ++:

#include <map>
#include <string>

int main() {
    using std::map;  using std::string;

    map<string, string> ss;
    ss["abs"] = "Absolute";

    const string foo = ss["abs"];
    std::cout << ss["abs"] << ", or " << foo << std::endl;
}

В C ++ 0x, если вы хотите «безопасный» доступ, который выдает исключение, если тип ключа не найден, используйте map::at (на самом деле, отсутствие map::at было просто упущением в текущий стандарт):

    std::cout << ss.at("weird keY");

или проверьте, существует ли он:

    if (ss.find("weird keY")==ss.end())
        std::cout << "key not found\n";
1 голос
/ 10 августа 2011

если вы говорите о c ++ / cli, вы можете использовать это Hashtable ^ openWith = gcnew Hashtable ();

    // Add some elements to the hash table. There are no
    // duplicate keys, but some of the values are duplicates.
    openWith->Add("txt", "notepad.exe");
    openWith->Add("bmp", "paint.exe");
    openWith->Add("dib", "paint.exe");
    openWith->Add("rtf", "wordpad.exe");

от http://msdn.microsoft.com/fr-fr/library/system.collections.hashtable.aspx#Y4406 еще использовать карту из stdlib.

Я думаю, вы также можете использовать CMAP от MFC, здесь есть хорошая статья: http://www.codeproject.com/KB/architecture/cmap_howto.aspx

0 голосов
/ 10 августа 2011

enum имеет интегральное значение. Лично я просто предлагаю две функции преобразования:

  • enum -> string
  • string -> enum

Первый может быть реализован с помощью простого массива, второй требует двоичного поиска в отсортированном списке.

0 голосов
/ 10 августа 2011

вы можете использовать строковый массив (размером 2) из ​​string.hi, подумайте (либо это, либо просто строка; один для C, а другой для cpp).первая строка - «abs» вторая - «absolute».

например:

#include <string>

...

string abs[2]; //or a better name that's more relevant to you

abs[0] = "abs";
abs[1] = "absolute";

...

//pass it into the function
cout << abs[1] << endl;

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