问题是具体的,但解决方案是开放的。我是一个孤单的程序员,希望和一些程序员同事一起讨论一些想法。
我有一个数学库的包装器。包装器为系统提供了一致的接口,同时允许我切换不同平台的数学库。包装器只包含一个成员,因此假设我的Matrix4x4包装器类有一个api_matrix_4x4结构作为包装器的唯一成员。
我当前的目标平台有一个漂亮的小优化库,其中一些漂亮的函数需要包装器的嵌入式成员的C样式数组,而那些数学API函数的包装器函数不希望将该成员类型公开给系统的其余部分。因此,我们有一个进入函数的包装器集合(引用/指针)&包装器的成员在函数内部的集合中是需要的,因此可以将它们传递给数学API。
我主要使用包括C++11特性在内的C++,也可以使用C风格。理想情况下,我想要一个无异常的解决方案&即使不是所有动态分配,也可以避免尽可能多的动态分配。我的包装器函数可以使用标准库数组或向量,或者指向数组的C风格指针作为参数&无论内部需要什么,只要没有动态类型转换(运行时类型信息)即可。
1)我是否可以将包含单个自定义结构的自定义结构/类转换为自定义结构?如果是这样的话,如果它是它们的标准库集合呢?我在考虑这里的类型切片。
2)您是否会使用模板来屏蔽传递给函数的类型,尽管实现只能作用于单个类型(基于所使用的数学API ),或者这样使用模板是不好的吗?
3)你能想出一个很好的解决方案吗,也许涉及到交换/移动语义/位置?如果是这样,请告诉我这件事。
4)或者我听天由命,迭代一个集合,将成员带到另一个集合中,然后将其用于API函数?
我正在做的包装器结构和包装器函数签名的例子,以及我试图避免做的例子是由函数实现给出的:
struct Vector3dWrapper
{
API_Specific_Vector_3d m_api_vector_3d;
inline void operation_needing_vector_3d_wrappers(std::vector<Vector3d>& vectors)
{
// Now need a collection of API_Specific_Vector_3ds
try
{
std::Vector<API_Specific_Vector_3d> api_vectors;
api_vectors.reserve(vectors.size());
for( auto vectors_itr = vectors.begin(); vectors_itr != vectors.end(); ++vectors)
{
// fill each Vector3d.m_api_vector_3d into api_vectors
}
}
catch(std::bad_alloc &e)
{
// handle... though in reality, try/catch is done elsewhere in the system.
}
// Signature is API_Multiply_Vectors_With_Matrix_And_Project(API_Specific_Vector_3d* vectors, size_t vector_count)
API_Multiply_Vectors_With_Matrix_And_Project(&api_vectors, api_vectors.size());
}
};发布于 2012-04-01 23:52:55
&.#include.typedefs设置为什么来执行相同的操作?默认的复制和移动语义应该适用于包含数字的平面C样式结构。至于深度复制,如果底层的库具有基于指针的结构,则需要小心并实现所需的所有语义。安全…简单的…默认…"nifty“听起来很下流。https://stackoverflow.com/questions/9965251
复制相似问题