在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;
}
如何向编译器表明我希望它选择第二个重载?
答案 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;
}