Преобразовать имя переменной члена в строку

Могу ли я перечислить char* члены класса (или структуры) в C ++? Если да, могу ли я напечатать имена переменных в виде строк? Используете препроцессор?

У меня есть класс со всеми членами const char *. Было бы хорошо, если бы существовал элегантный способ перечисления каждой переменной-члена и проверки имени в виде строки по отношению к указанному мной ключу строки.

Вот какой код можно использовать?

Кто-нибудь может придумать способ сделать это?

class configitems {
public:
configitems() : host(0), colour(0) {}
const char* host;
const char* colour;
//... etc
};

int main() {

configitems cfg;
//cfg.colour = "red";

//receive an config item as a string.  I want to check that the item is a valid one (eg is a
//variable of class configitem) and then populate it.

//eg get colour=red so want to do something like this:
if(isConfigItem("colour")) {
cfg.<colour> = "red";
}
return 0;
}

1

Решение

Как уже говорили другие, имя переменной фактически не существует в сгенерированном коде, как только компилятор завершил компиляцию кода. Он может существовать в символах отладки или некоторых других, но это ужасная путаница, чтобы попытаться выяснить, где находится ваша переменная [она вполне может находиться в разных местах в зависимости от того, использует ли компилятор в настоящее время регистр или область памяти для хранения его значение и т. д. и т. д.].

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

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

  1. Используя std::map<std::string, std::string>
  2. Используя массив или вектор std::pair<std::string, std::string>

Вы также можете иметь фрагмент фиксированного кода, который понимает различные параметры конфигурации и их перевод в переменные. Это совсем не плохое решение, если их не так много.

Или вы можете построить массив следующим образом:

enum config_vals
{
host,
color,
...
max_config
};

struct translation
{
const char *name;
config_vals val;
};

#define TRANS(x) { #x, x }

translation trans[]] = {
TRANS(host),
TRANS(color),
};

class configitems
{
...
std::string value[max_configs];
...
}

...

configitems c;
...
if (c.value[host] == "localhost") ...
1

Другие решения

В C ++ невозможно преобразовать имя переменной в строку. В некоторых случаях имя переменной даже не существует в скомпилированном исполняемом файле (зависит от области видимости и видимости).

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

Еще один способ решить эту проблему — использовать std::map вместо этого он использует строки типа «host» в качестве ключей и перечисляет это.

1

В C ++ нет способа сделать именно то, что вы пытаетесь сделать. Но если все, что вам нужно, это набор пар ключ-значение, то есть решения.

Например, вместо class configitemsсделай это std::map<std::string, std::string> configitems:

std::map<std::string, std::string> configitems;
//...
configitems.insert( std::pair<std::string,std::string>( "colour", "red" ) );
0
По вопросам рекламы [email protected]