在C++中将变量的名称转换为字符串?
Converting a variable's name to a string in C++?
main function
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);
}
许多人,包括我自己,会建议不要像这样使用预处理器。 我只是说这是可能的。
你想做的叫做反射(维基百科)。由于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.
};
如果看起来有用,请随意更改 difference 函数的返回类型,或添加成员以便您可以
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);
相关文章:
- wcstombs_s(),转换字符串的长度
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 无法转换字符串插入函数的参数
- 转换字符串向量:基于先前的值跳过元素
- 从中间器转换字符串不起作用,出了什么问题?
- 失败的证明转换字符串到枚举类
- 如何使用正则表达式和提升转换迭代器标记和转换 c 字符串
- 使用java jni时转换字符串类型
- 如何避免在转换字符串令牌流时重复istringstream构造
- 阿托伊未正确转换字符串
- C++,转换字符串,使连续下划线序列变为单个下划线
- 使用长算术转换字符串
- 转换字符串十进制数时的精度
- 将词法转换字符串提升为双精度
- 使用marshal_as函数转换字符串的性能
- C++不会从数据转换字符串
- 无论如何,在c++ /Qt中转换字符串到结构中的字段
- C++ 隐式类型转换字符串 -> int?
- 转换字符串到浮点数,c++实现
- 用于转换字符串大小写的函数