0

我正在为我的项目重构一个类以适应 int 数据。代码比较复杂,下面举个简单的例子:

struct A {
  A(int a):a_(a) {}  // Supports implicit conversion from int
  int a_;
};

void print(A a) { cout<<a.a_<<endl; }

void x2(A *a) {   // change a's value
  a->a_ *= 2;
}

int main() {
  int b = 2;
  print(b);      // pass int as A without any problem
  x2(&b);        // pass int* as A* - failed
  cout<<b<<endl; // b is supposed to changed by x2()
}

在这种情况下,模板可能是一个不错的选择,但我担心用模板重写整个类将是一项巨大的工作,并且会对可读性造成一点损害,尤其是对我的同事而言。

有没有其他方法可以将“int*”用作“A*”?

4

1 回答 1

2

不,没有“办法”。你在这里试图做的是违反合同x2,这a将是一个有效的指针A

最简单的更改是更改x2为:(这里真的不需要使用指针)

void x2 (A& a) {
    a.a_ *= 2;
}

然后用包裹在 int 周围的 A 值调用它(就像@jrok 建议的那样):

A a(2);
x2(a);

如果您不喜欢打印,请提供operator<<A.

于 2013-07-18T10:09:24.387 回答