Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用跟踪参考选择重载_.net_Visual C++_C++ Cli_Overloading - Fatal编程技术网

.net 使用跟踪参考选择重载

.net 使用跟踪参考选择重载,.net,visual-c++,c++-cli,overloading,.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中,编译器(可以理解)无法选择正确的重载: v

在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;
}

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

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

编辑:汉斯说的不完全是真的。这会生成(几乎)与C版本完全相同的IL(不同之处在于它添加了一个
modopt([mscorlib]System.Runtime.CompilerServices.IsExplicitlyDereferenced)
):

void Add(矢量3 a、矢量3 b、[Out]矢量3%c)
{
添加(&a、&b、c);
}
无效添加(内部打印a、内部打印b、[Out]矢量3%c)
{
c、 X=a->X+b->X;
c、 Y=a->Y+b->Y;
c、 Z=a->Z+b->Z;
}

C++/CLI对此没有语法。你需要对原生C++进行一点调整,在.NET中存在值类型,使代码更高效。它们应该按值传递,这允许它们存储在CPU寄存器中。不管怎么说,你的Add()函数总是由优化器内联的。如果它有那么高的效率,我会很困惑,微软的XNA的所有数学API的形式都是引用向量之类的。但是,是的,我明白你的意思,至少当我们处理像向量这样的小结构时——但是矩阵呢?按值传递仍然有效吗?另外,考虑到所有数学API都会产生模糊的重载错误,这是否意味着C++/CLI无法使用XNA?(编辑:我现在发现我没有正确地回忆起来;他们的Vector3API没有引用向量,但他们的matrix API接受向量)。当然,这是一个XNA问题。它们违反了一个强大的.NET设计准则,结构的成员不应超过4个。超出这个范围会杀死它们的价值,你应该切换到一个类。不寻常的错误顺便说一句。好吧,我已经回答了我的问题,我明天会接受,除非你做出回答。非常感谢。:)
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;
}