使用跟踪参考选择过载

时间:2014-06-03 14:02:59

标签: .net visual-c++ c++-cli overloading

在C#中,我可以使用以下代码:

void Add(Vector3 a, Vector3 b, out Vector3 c)
{
  Add(ref a, ref b, out c);
}

void Add(ref Vector3 a, ref Vector3 b, out Vector3 c)
{
  c.X = a.X + b.X;
  c.Y = a.Y + b.Y;
  c.Z = a.Z + b.Z;
}

但是,在C ++ / CLI中,编译器(可以理解)无法选择正确的重载:

void Add(Vector3 a, Vector3 b, [Out] Vector3% c)
{
  Add(a, b, c);
}

void Add(Vector3% a, Vector3% b, [Out] Vector3% c)
{
  c.X = a.X + b.X;
  c.Y = a.Y + b.Y;
  c.Z = a.Z + b.Z;
}

如何向编译器表明我希望它选择第二个重载?

1 个答案:

答案 0 :(得分:0)

正如Hans Passant在对我的帖子的评论中所说,这是不可能的。价值点类型是它们应该足够小以便有效地复制,如果不是,它们不应该是值类型。因此几乎在所有情况下都不需要第二次过载。

编辑:汉斯所说的并不完全正确。这会产生(几乎)与C#版本完全相同的IL(区别在于它添加了modopt([mscorlib]System.Runtime.CompilerServices.IsExplicitlyDereferenced)):

void Add(Vector3 a, Vector3 b, [Out] Vector3% c)
{
  Add(&a, &b, c);
}

void Add(interior_ptr<Vector3> a, interior_ptr<Vector3> b, [Out] Vector3% c)
{
  c.X = a->X + b->X;
  c.Y = a->Y + b->Y;
  c.Z = a->Z + b->Z;
}