C ++ / CLI ref参数重载

问题描述 投票:1回答:1

我有一个用于数学的C ++ / CLI值类(C#中的struct)。

如您所知,数学相关结构通常使用ref参数来提高其性能。然后,添加一个非qazxsw poi版本的重载以方便。

像这样,在C#中

ref

另一方面,在C ++ / CLI中,我制作了如下所示的public struct Vector { public static Vector Add(Vector left, Vector right) => Add(ref left, ref right); public static Vector Add(ref Vector left, ref Vector right) { // Something. } } 版本。

ref

它没有问题。在C#项目中正确暴露public value class Vector { public: static Vector Add(Vector% left, Vector% right) { // Something. } } 参数。

顺便说一下,非ref版本怎么样。我可以声明它的原型,但我不能从中调用ref版本。

ref

怎么解决?

c++-cli
1个回答
0
投票

你的目标是什么?

如果您的目标是拥有可以从C ++ / CLI调用的API,然后忽略如何实现这两个版本的问题,您将如何从C ++ / CLI代码调用它们?由于C ++ / CLI在调用ref版本时不需要额外的关键字,因此在尝试使用public value class Vector { public: static Vector Add(Vector left, Vector right) { return Add(left, right); // Compile error C2668. } static Vector Add(Vector% left, Vector% right) { // Something. } } 的任何地方都会出现错误C2668。在这种情况下,我将实现具有不同名称的两个版本。

如果你的目标是拥有一个可以从C#调用的API,那么使用这两个方法具有相同名称可能是有意义的,因为C#可以根据Add关键字来区分调用哪一个。在这种情况下,我将实现refAdd(Vector, Vector)作为私人方法Add(Vector%, Vector%)

我没有用编译器检查过这个。由于调用方法的方式非常相似,因此即使修复了实现,也可能会出现编译器错误。最后我检查过,一个非托管的C ++编译器甚至不允许你沿着AddImpl(Vector%, Vector%)foo(int)的行定义一个重载,因为它们以完全相同的方式被调用。 (虽然我可能会误解这一点。)


现在,所有这一切,让我说这对我来说是一个不成熟的优化。考虑仅实施“按价值调用”版本,如果您的表现可以接受,那么就不需要这些额外的箍。

此外,您尚未显示foo(int&)类型中数据的定义。如果它足够重,你正在考虑通过引用调用来节省复制对象的时间,那么也许应该将它改为引用类型。

© www.soinside.com 2019 - 2024. All rights reserved.