首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有单个成员(也是自定义结构)的自定义结构(包装)的集合,到单个成员的集合

具有单个成员(也是自定义结构)的自定义结构(包装)的集合,到单个成员的集合
EN

Stack Overflow用户
提问于 2012-04-01 22:43:36
回答 1查看 201关注 0票数 2

问题是具体的,但解决方案是开放的。我是一个孤单的程序员,希望和一些程序员同事一起讨论一些想法。

我有一个数学库的包装器。包装器为系统提供了一致的接口,同时允许我切换不同平台的数学库。包装器只包含一个成员,因此假设我的Matrix4x4包装器类有一个api_matrix_4x4结构作为包装器的唯一成员。

我当前的目标平台有一个漂亮的小优化库,其中一些漂亮的函数需要包装器的嵌入式成员的C样式数组,而那些数学API函数的包装器函数不希望将该成员类型公开给系统的其余部分。因此,我们有一个进入函数的包装器集合(引用/指针)&包装器的成员在函数内部的集合中是需要的,因此可以将它们传递给数学API。

我主要使用包括C++11特性在内的C++,也可以使用C风格。理想情况下,我想要一个无异常的解决方案&即使不是所有动态分配,也可以避免尽可能多的动态分配。我的包装器函数可以使用标准库数组或向量,或者指向数组的C风格指针作为参数&无论内部需要什么,只要没有动态类型转换(运行时类型信息)即可。

1)我是否可以将包含单个自定义结构的自定义结构/类转换为自定义结构?如果是这样的话,如果它是它们的标准库集合呢?我在考虑这里的类型切片。

2)您是否会使用模板来屏蔽传递给函数的类型,尽管实现只能作用于单个类型(基于所使用的数学API ),或者这样使用模板是不好的吗?

3)你能想出一个很好的解决方案吗,也许涉及到交换/移动语义/位置?如果是这样,请告诉我这件事。

4)或者我听天由命,迭代一个集合,将成员带到另一个集合中,然后将其用于API函数?

我正在做的包装器结构和包装器函数签名的例子,以及我试图避免做的例子是由函数实现给出的:

代码语言:javascript
复制
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());
   }

};
EN

回答 1

Stack Overflow用户

发布于 2012-04-01 23:52:55

  1. 您可以将标准布局结构(如与C兼容的结构)强制转换为它的第一个成员,但这有什么意义呢?只需访问第一个成员并应用&.
  2. Templates,通常允许对一组类型进行统一的参数化。您可以编写一个只实例化一次的模板,但这似乎再一次没有意义。您真正想要的是为每个平台提供不同的接口库。也许模板可以帮助定义它们之间共享的公共代码。或者,您可以在普通C中通过将#include.
  3. Solution之前的typedefs设置为什么来执行相同的操作?默认的复制和移动语义应该适用于包含数字的平面C样式结构。至于深度复制,如果底层的库具有基于指针的结构,则需要小心并实现所需的所有语义。安全…简单的…默认…"nifty“听起来很下流。
  4. 不太明白你在用集合做什么。您的意思是,每个函数都需要首先将其参数插入到通用容器对象中?构建容器听起来很昂贵。您的函数应该尽可能地与基础库中的函数并行。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9965251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档