Могу ли я перечислить 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;
}
Как уже говорили другие, имя переменной фактически не существует в сгенерированном коде, как только компилятор завершил компиляцию кода. Он может существовать в символах отладки или некоторых других, но это ужасная путаница, чтобы попытаться выяснить, где находится ваша переменная [она вполне может находиться в разных местах в зависимости от того, использует ли компилятор в настоящее время регистр или область памяти для хранения его значение и т. д. и т. д.].
Конечно, возможно иметь макрос, который генерирует соответствующий строковый элемент имени в параметре.
Однако, вероятно, лучше использовать другой механизм для вещей типа конфигурации — пара очевидных вариантов:
std::map<std::string, std::string>
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") ...
В C ++ невозможно преобразовать имя переменной в строку. В некоторых случаях имя переменной даже не существует в скомпилированном исполняемом файле (зависит от области видимости и видимости).
Даже если бы это было возможно, все равно невозможно перечислить членов класса.
Еще один способ решить эту проблему — использовать std::map
вместо этого он использует строки типа «host» в качестве ключей и перечисляет это.
В 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" ) );