首页 > 解决方案 > 使用 C++ 宏进行条件替换?

问题描述

对于struct point{float x,y,z;},我想定义许多函数,在每个函数中,我对x,y和做同样的事情z。例如float size = 1 * x*y*zfloat edge = 0+x+y+z...所以我想知道,我可以写一个宏,或者类似的东西, #define forxyz(codes) ??????? 当我写 forxyz(res=res+d;) 它调用时res=res+x; res=res+y;res=res+z;

Urrr,让我说得更清楚。我有大约 20 个函数,每个函数只调用一次,所以我不想将它们附加到结构中。而且,它并不像'+'那么简单。例如,我可能有

x_in_middle(point a, point b, point c, float d){
    if(b.x<a.x && a.x<c.x){
        if(d>0) return a.x;
        if(d<0) return a.x*a.x;
        if(d==0) return 0;
    }
}

我正在想办法不写

if(b.x<a.x && a.x<c.x){
        if(d>0) return a.x;
        if(d<0) return a.x*a.x;
        if(d=0) return 0;
    }

三次!

在这种情况下res=res+d很简单,但在我的情况下,它可能是几行代码......有时我想调用set_x, set_y, set_z函数......

到目前为止,我最好的主意是制作res=res+d另一个宏,即 #define add(d) res=res+d 然后

add(x);
add(y);
add(z);

但这显然会创建太多宏,而且我认为这并不优雅......

标签: c++c

解决方案


point一个简单的方法是编写一个以s 为参数的独立函数:

point add(const point& a, const point& b)
{
  point c;
  c.x = a.x + b.x;
  c.y = a.y + b.y;
  c.z = a.z + b.z;
  return c;
}  

你会这样使用:

point a, b, c;
//...
c = add(a, b);

你也可以重载operator +

point operator+(const point& a, const point& b)
{
  point c;
  c.x = a.x + b.x;
  c.y = a.y + b.y;
  c.z = a.z + b.z;
  return c;
}  

您的用法可能如下所示:

point a, b, c;
//...
c = a + b;

推荐阅读