Преобразование имени переменной в строку в C ++?

основная функция

main(){

foo x=1, y=1, z=1;

}

Заголовок / класс

class foo{

public:
double a, b, c;
double fn, val;

// set a,b, and c
void set(){
a=1;
b=1;
c=1;
}

// constructor
foo(double &f){
set();

// what I want to do here is say if "name of variable f" = "x", then do something
// else if "name of variable f" = "y", do something else
// else if "name of variable f" = "z", do something else
}
};

Как вы можете видеть в основной функции, x, y и z имеют одинаковое значение. Я пытаюсь написать условие, которое имеет дело с этим случаем, и один из способов, который я придумал, чтобы проверить имена переменных. Потому что я ВСЕГДА хочу сделать одно и то же для объекта класса foo с именем «x», и всегда делать то же самое для «y» и так далее, независимо от того, что это за значения.

0

Решение

Вы не можете сделать то, что вы просите в своем вопросе, есть несколько способов сделать что-то подобное.

Вы можете использовать наследование.

class foo{

public:
double a, b, c;
double fn, val;

// set a,b, and c
void set(){
a=1;
b=1;
c=1;
}

// constructor
foo(double &f){
set();
}
};

class X : public foo {
{
public:
X (double &f) : foo(f) {
// do stuff for x
}
};

class Y : public foo {
{
public:
Y (double &f) : foo(f) {
// do stuff for y
}
};

class Z : public foo {
{
public:
Z (double &f) : foo(f) {
// do stuff for z
}
};

main(){

X x=1;Y y=1;Z z=1;

}

Или вы можете использовать перечисление

class foo{
public:
enum Mode{
Mode_X,
Mode_Y,
Mode_Z
};
Mode mode;

double a, b, c;
double fn, val;

// set a,b, and c
void set(){
a=1;
b=1;
c=1;
}

foo(Mode m, double &f) : mode(m) {
set();

switch(mode) {
case Mode_X:
// what I want to do here is say if "name of variable f" = "x", then do something
break;
case Mode_Y:
// else if "name of variable f" = "y", do something else
break;

case Mode_Z:
// else if "name of variable f" = "z", do something else
break;
}
}
};

main(){

foo x(foo::Mode_X,1), y(foo::Mode_Y,1), z(foo::Mode_Z,1);

}

Вы можете использовать препроцессор с версией перечисления, чтобы приблизить объявление переменной к тому, о чем вы изначально просили, вот так:

#define X(value) x(foo::Mode_X,(value))
#define Y(value) y(foo::Mode_Y,(value))
#define Z(value) z(foo::Mode_Z,(value))

main(){
foo X(1), Y(1), Z(1);
}

Многие люди, включая меня, не советуют использовать препроцессор, как этот. Я только говорю, что это возможно.

1

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

То, что вы пытаетесь сделать, называется отражением (Википедия). Поскольку C ++ является скомпилированным неуправляемым языком, он не поддерживает рефлексию.

Кроме того, когда код компилируется в C ++, компилятор искажает имена переменных поэтому переменные, которые вы считаете созданными (x, y, z), вообще не названы так, как вы думаете, а новые имена не имеют значения.

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

0

В комментариях вы упоминаете, что пишете класс для частичной дифференциации. Вот рекомендуемая отправная точка:

class Differentiator{
public:
double a, b, c;
double fn, val;
void differentiateByX(double &f);
void differentiateByY(double &f);
void differentiateByZ(double &f);

Differentiator(): a(1), b(1), c(1)
{} // Note the syntax above for initializing members.
};

Если это кажется полезным, смело изменяйте тип возвращаемого значения дифференцирующих функций или добавляйте элементы, чтобы вы могли

main(){
Differentiator foo;
foo.differentiateByX(1);
// do something with the result
foo.differentiateByY(2);
// etc.
}

Если вы знаете, что вы всегда хотите дифференцировать по X, Y и Z, вы можете иметь один Differentiator сделать все три с одной функцией, differentiate(double &x, double &y, double &z) или вернитесь к выполнению всей работы в вашем конструкторе: Differentiator foo(x, y, z);

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector