C++/CLI ref 参数重载
C++/CLI ref parameter overloading
我有一个用于数学的 C++/CLI 值 class(C# 中的结构)。
如您所知,与数学相关的结构通常在其方法中使用 ref
参数来提高性能。然后,为了方便起见,添加一个非ref
版本的重载。
像这样,在C#中
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.
}
}
另一方面,在 C++/CLI 中,我制作了 ref
如下版本。
public value class Vector
{
public:
static Vector Add(Vector% left, Vector% right)
{
// Something.
}
}
没问题。在 C# 项目中正确公开 ref
参数。
顺便说一句,非ref
版本怎么样。
我可以声明它的原型,但我不能从中调用 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.
}
}
如何解决?
你的目标是什么?
如果您的目标是API 可以从C++/CLI 调用,那么忽略如何实现这两个版本的问题,您将如何从C++/CLI 代码调用它们?由于 C++/CLI 在调用 ref 版本时不需要额外的关键字,因此在您尝试使用 Add
的任何地方都会收到错误 C2668。在那种情况下,我将实现两个具有不同名称的版本。
如果您的目标是拥有一个可以从 C# 调用的 API,那么让这两个方法同名可能是有意义的,因为 C# 可以根据ref
关键字。在那种情况下,我会将 Add(Vector, Vector)
和 Add(Vector%, Vector%)
实现为 both 调用私有方法 AddImpl(Vector%, Vector%)
。
我还没有用编译器检查过这个。由于您调用这些方法的方式非常相似,因此即使您修复了实现,您也可能会遇到编译器错误。最后我检查了一下,非托管 C++ 编译器甚至不允许您按照 foo(int)
和 foo(int&)
行定义重载,因为它们的调用方式完全相同。 (虽然我可能记错了。)
现在,综上所述,让我说这对我来说感觉像是过早的优化。考虑仅实施 'call by value' 版本,如果您的性能可以接受,则不需要这些额外的箍。
此外,您还没有显示您对 Vector
类型中的数据的定义。如果它足够重以至于您正在考虑通过引用调用以节省复制对象的时间,那么也许应该将它更改为引用类型。
我有一个用于数学的 C++/CLI 值 class(C# 中的结构)。
如您所知,与数学相关的结构通常在其方法中使用 ref
参数来提高性能。然后,为了方便起见,添加一个非ref
版本的重载。
像这样,在C#中
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.
}
}
另一方面,在 C++/CLI 中,我制作了 ref
如下版本。
public value class Vector
{
public:
static Vector Add(Vector% left, Vector% right)
{
// Something.
}
}
没问题。在 C# 项目中正确公开 ref
参数。
顺便说一句,非ref
版本怎么样。
我可以声明它的原型,但我不能从中调用 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.
}
}
如何解决?
你的目标是什么?
如果您的目标是API 可以从C++/CLI 调用,那么忽略如何实现这两个版本的问题,您将如何从C++/CLI 代码调用它们?由于 C++/CLI 在调用 ref 版本时不需要额外的关键字,因此在您尝试使用 Add
的任何地方都会收到错误 C2668。在那种情况下,我将实现两个具有不同名称的版本。
如果您的目标是拥有一个可以从 C# 调用的 API,那么让这两个方法同名可能是有意义的,因为 C# 可以根据ref
关键字。在那种情况下,我会将 Add(Vector, Vector)
和 Add(Vector%, Vector%)
实现为 both 调用私有方法 AddImpl(Vector%, Vector%)
。
我还没有用编译器检查过这个。由于您调用这些方法的方式非常相似,因此即使您修复了实现,您也可能会遇到编译器错误。最后我检查了一下,非托管 C++ 编译器甚至不允许您按照 foo(int)
和 foo(int&)
行定义重载,因为它们的调用方式完全相同。 (虽然我可能记错了。)
现在,综上所述,让我说这对我来说感觉像是过早的优化。考虑仅实施 'call by value' 版本,如果您的性能可以接受,则不需要这些额外的箍。
此外,您还没有显示您对 Vector
类型中的数据的定义。如果它足够重以至于您正在考虑通过引用调用以节省复制对象的时间,那么也许应该将它更改为引用类型。