【发布时间】:2009-07-16 14:08:50
【问题描述】:
我正在编写一个计算机图形应用程序,该应用程序利用了几个不同的库,这些库提供了许多必需的功能。
例如,在大学时,我编写了四元数、优化的 3 向量和优化的 4x4 矩阵类,我喜欢使用这些类,因为它们很高效而且我对它们非常熟悉。我还写了一个只依赖于 STL 的 K-D Tree 实现。
最后,我使用 ITK 来计算给定对称实数矩阵的最小特征值(和相关的特征向量)等等。
所有这些库都包含自己的矩阵和向量实现,我发现自己做了很多这样的事情:
FixedPointType closestPointCoords;
KdTree::HyperPoint target(3);
target[0] = transformedPoint[0];
target[1] = transformedPoint[1];
target[2] = transformedPoint[2];
KdTree::Neighbor result = FixedPointTree.FindNearestNeighbor(target);
minimumDistance = result.GetDistance();
closestPointCoords[0] = result.GetPoint().Get(0);
closestPointCoords[1] = result.GetPoint().Get(1);
closestPointCoords[2] = result.GetPoint().Get(2);
显然我可以编写一个看起来像这样的函数:
FixedPointType ConvertHyperPointToFixedPointType(const KdTree::HyperPoint &p)
{
FixedPointType fixedPoint;
fixedPoint[0] = p[0];
fixedPoint[1] = p[1];
fixedPoint[2] = p[2];
return fixedPoint;
}
我想通过执行以下操作来避免添加库间依赖:
class HyperPoint
{
...
operator FixedPointType()
{
// Same content as ConvertHyperPointToFixedPointType above
}
...
};
但我想知道是否有人提出了一个更优雅的解决方案来解决这个问题。
也许我应该从 .NET 书籍中取出一页并创建一个静态 Convert 类?
您如何处理跨库的类型冗余以及在各种类型之间频繁转换的需求?
Adapter 模式在这里合适吗?
更新
经过更多探索后,我遇到了TypeConverter。所以这个问题看起来已经在 C# 中得到解决。我仍在寻找一种干净、高效且简单的 C++ 方法。到目前为止,我正在考虑规范类型,或者可能只是简单的 ConvertHyperPointToFixedPointType 类型的函数。
更新 2 经过更多阅读之后,听起来规范类型实际上将充当垫片。请参阅此paper 了解更多信息。
这里有一些示例代码来说明我目前的倾向:
class VectorConverter
{
public:
VectorConverter(const VectorImp1 &v1)
{
_data[0] = v1[0];
_data[1] = v1[1];
_data[2] = v1[2];
}
VectorConverter(const VectorImp2 &v2)
{
_data[0] = v2.Get(0);
_data[1] = v2.Get(1);
_data[2] = v2.Get(2);
}
operator VectorImp1()
{
return VectorImp1(_data[0], _data[1], _data[2]);
}
operator VectorImp2()
{
VectorImp2 v2;
v2.Set(0, _data[0]);
v2.Set(1, _data[1]);
v2.Set(2, _data[2]);
return v2;
}
// actual vector implementation goes here or a wrapper around an existing one
};
// example usage
VectorImp1 closestPointCoords, target;
// for the sake of illustration I included the cast, but you could implicitly cast
KdTree::Neighbor result = FixedPointTree.FindNearestNeighbor((VectorImp2)VectorConverter(target));
minimumDistance = result.GetDistance();
closestPointCoords = (VectorImp1)VectorConverter(result.GetPoint());
感谢您的所有帮助。如果有人遇到更好的东西,请随时更新这篇文章。
【问题讨论】:
标签: design-patterns math type-conversion