[英]Converting a variable's name to a string in 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都具有相同的值。 我试图编写一个处理这种情况的条件,并且我想出了一种方法来检查变量名。 因为我总是要对名为“ x”的foo类的对象执行相同的操作,并且始终对“ 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);
}
许多人,包括我自己在内,都建议不要使用这种预处理器。 我只是说有可能。
您在注释中提到您正在编写一个进行部分区分的类。 这是一个建议的起点:
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
,则可以让一个Differentiator
器用一个函数完成所有三个操作,然后进行differentiate(double &x, double &y, double &z)
或返回执行构造函数中的所有工作: Differentiator foo(x, y, z);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.