основная функция
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» и так далее, независимо от того, что это за значения.
Вы не можете сделать то, что вы просите в своем вопросе, есть несколько способов сделать что-то подобное.
Вы можете использовать наследование.
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);
}
Многие люди, включая меня, не советуют использовать препроцессор, как этот. Я только говорю, что это возможно.
То, что вы пытаетесь сделать, называется отражением (Википедия). Поскольку C ++ является скомпилированным неуправляемым языком, он не поддерживает рефлексию.
Кроме того, когда код компилируется в C ++, компилятор искажает имена переменных поэтому переменные, которые вы считаете созданными (x, y, z), вообще не названы так, как вы думаете, а новые имена не имеют значения.
К сожалению, когда вы пытаетесь добиться этого путем проверки имени переменной, это не может быть сделано в C ++.
В комментариях вы упоминаете, что пишете класс для частичной дифференциации. Вот рекомендуемая отправная точка:
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);