- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图通过创建重载的转换运算符在我的数学库和一些 DirectX 内置方法之间创建互操作性。基本上我的结构需要将自己转换为对象或它在 DirectX 库中相关的对象的指针。示例如下:
//overloaded conversion operators
Vector3D::operator D3DXVECTOR3() const;
Vector3D::operator D3DXVECTOR3*() const;
我的问题在于某些 DirectX 方法具有同时采用引用和指针的重载,因此当我尝试传递我的对象时收到一个不明确的调用错误。我想让最终用户尽可能无缝地使用它,所以我不想使用显式转换方法(例如 ToD3DXVECTOR3())或显式调用运算符。
所以我希望它表现得像这样:
//signature for DirectX method
//D3DXVec3Add(D3DXVECTOR3* vect1, D3DXVECTOR3* vect2) or
//D3DXVec3Add(D3DXVECTOR& vect1, D3DXVECTOR3& vect2)
Vector3D v1(1,1,1);
Vector3D v2(2,2,2);
D3DXVec3Add(v1, v2);
而不是像这样:
D3DXVec3Add(v1.toD3DXVECTOR3(), v2.toD3DXVECTOR3());
我不确定这是否可能,但对于如何解决歧义有什么建议吗?
编辑:
虽然我不能只依赖隐式转换,但我将采用 Mr.C64 留下的建议。一个区别是 Vector3D 结构不包含它可以转换为成员变量的对象:
struct Vector3D
{
float X;
float Y;
float Z;
...
//Implicit conversion operators
operator D3DXVECTOR3() const;
operator D3DXVECTOR3*() const;
operator DirectX::XMFLOAT3() const;
operator DirectX::XMFLOAT3*() const;
operator DirectX::XMVECTOR() const;
operator DirectX::XMVECTOR*() const;
...
//Explicit conversion methods
D3DXVECTOR3 ToD3DXVECTOR3() const;
static Vector3D FromD3DXVECTOR3(const D3DXVECTOR3& vector);
DirectX::XMFLOAT3 ToXMFLOAT3() const;
static Vector3D FromXMFLOAT3(const DirectX::XMFLOAT3& value);
DirectX::XMVECTOR ToXMVECTOR() const;
static Vector3D FromXMVECTOR(const DirectX::XMVECTOR& value);
private:
...
};
最佳答案
您是否可以从 D3DXVECTOR3
派生您的 Vector3D
类?就像 ATL::CRect
类派生自 Win32 RECT
结构(添加方便的方法)。
如果这不可能或不适合您的特定设计上下文,请考虑提供明确的转换方法,就像 std::string
提供 .c_str()
方法来获取 const char*
指针,而不是使用隐式转换。您可能也会发现这篇博文很有趣:
Reader Q&A: Why don’t modern smart pointers implicitly convert to *?
此外,我注意到 D3DXVec3Add()
仅使用指向 D3DXVECTOR3
实例的指针。因此,如果您不能从 D3DXVECTOR3
派生自己的类(如您在评论中所述),那么提供几个 getter(都是 const
和非 const
版本),像这样:
class Vector3D
{
public:
....
// Get read-only access to wrapped D3DX vector
const D3DXVECTOR3* Get() const
{
return &m_vec;
}
// Get read-write access to wrapped D3DX vector
D3DXVECTOR3* Get()
{
return &m_vec;
}
private:
D3DXVECTOR3 m_vec;
};
然后像这样使用它们:
Vector3D v1;
Vector3D v2;
Vector3D vSum;
D3DXVec3Add(vSum.Get(), v1.Get(), v2.Get());
关于c++ - 转换运算符重载 - 函数歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609517/
虽然我正在运行以测试此 thread 中的一些代码我发现了一件奇怪的事情,如果你考虑下面的程序 import java.util.ArrayList; import java.util.List; p
我只是很好奇为什么使用 using 指令以这种方式设计它。对于 1) struct 被视为命名空间,对于 2) 它不是: struct foo { using type0 = int; }; na
我需要在 ANTLR 中匹配一条消息,该消息包含由/分隔的 2 个字段第一个字段可以有 1..3 数字,第二个字段可以有 1..2 数字, 这不起作用 msg: f1 '/' f2; f1: DIGI
我想定义一个带有 x, y, z 坐标的 3D 矢量。可以使用(+)运算符添加向量,并可以使用length函数计算长度 如果我想编译它,我会收到以下错误: It could refer to eith
所以,今天我一直在测试 Java 的重载技术,但遇到了我无法解释的歧义。基本上,当存在带有原语及其相应包装器的可变参数方法时,编译器会提示并且无法决定选择哪一个,我不明白为什么?人类很容易决定而不是编
发现: Ambiguity while overloading the cast operator 和 C++ Operator Ambiguity 没有帮助 情况: 在容器类的内部我有: opera
我正在使用以下 XPath 片段 ancestor::contribution[1]/preceding-sibling::contribution[@speaker-reference][1] 我的
在尝试依赖可变参数模板实现一些事情时,我偶然发现了一些我无法解释的事情。我将问题归结为以下代码片段: template struct A {}; template class Z, typenam
我最近对 LALR 的研究足以写一篇 LALR generator ,并且我正在尝试为其构造一个 java 或 c# 风格的语法(其开头指定为 here )。 我知道编写解析器生成器需要额外的努力
在阅读 wikipedia article关于修订控制的文章,我发现了一些似乎定义不明确的术语,并且想知道它们是如何在现实世界中实际使用/应用的。具体来说: “主线”与“基线” “分支”与“流” “结
我有以下代码: class A{ public void print(A a){ System.out.println("A 1"); } } class B exte
考虑我试过的以下查询,有两个表,Orders 和 Customers,每个表都有列名称 CustomerID,当我尝试显示两个 CustomerID 时,只有一列显示,我不明白为什么会这样,或者我是理
我正在为基本汇编语言编写一个简单的组合词法分析器/解析器。我的问题是,在解析操作码时,我需要解析一些十六进制,它是指令计数器,可能是立即值等,以及实际的操作码。 基本上,当解析像 add 这样的东西时
我正在尝试在 mysql 中跨两个不同的数据库进行标题搜索,以匹配来自不同来源的数据。在 db1 或 db2 中,标题有时会在一个数据库中以“第一个标题”开头,而在另一个数据库中则以“第一个标题”开头
我对 token 级别的歧义有疑问。 问题看起来是这样的。我的代码看起来像这样,因此标记 t_UN1 具有更高的优先级。 t_ignore = ' \t\v\r' # whitespace ....
在 Main() 的最后一行,我在尝试执行指针操作时遇到错误,但我实际上想做的是调用我在 Foo 类中定义的乘法运算符。如果这不是调用乘法的语法,那是什么? namespace test {
在此page它说: The "00" specifier causes the value to be rounded to the nearest digit preceding the decim
我正在使用 C++ Builder 并使用 TDateTime 数据类型创建 GUI 应用程序。 当我在 TDateTime 对象上使用 MonthOf() 方法时,我得到的值比 TDateTime
$7.3.3/14 (C++03) struct A { int x(); }; struct B : A { }; struct C : A { using A::x; int x(in
我一直在开发一种适配器类,当我在 clang 下遇到问题。当定义了左值引用和右值引用的转换运算符时,您会在尝试从您的类中移出时遇到歧义编译错误(当这样的代码应该没问题时,如 operator cons
我是一名优秀的程序员,十分优秀!