对 C++ 类进行 STL 化

2024-02-06

我正在尝试编写一个包含多个 std::vectors 作为数据成员的类,并提供向量接口的子集来访问它们:

class Mesh
{
public:
private:
  std::vector<Vector3> positions;
  std::vector<Vector3> normals;
  // Several other members along the same lines
};

您可以使用网格做的主要事情是向其中添加位置、法线和其他内容。为了允许以类似 STL 的方式访问网格(从数组、其他容器等添加),我正在考虑添加如下方法:

public:
  template<class InIter>
  void AddNormals(InIter first, InIter last);

问题是,根据我对模板的理解,这些方法必须在头文件中定义(似乎是有道理的;如果没有具体的迭代器类型,编译器不知道如何生成目标代码来明显实现这个方法)。

  1. 这实际上是一个问题吗?我的直觉反应是不会在头文件中粘贴大量代码,但我的 C++ 有点生疏,除了玩具示例之外没有太多 STL 经验,而且我不确定在这方面什么是“可接受的”C++ 编码实践。

  2. 有没有更好的方法来公开此功能,同时保留类似 STL 的通用性 编程风格?一种方法是这样的:

(最终名单)

class RestrictedVector<T>
{
public:
  RestrictedVector(std::vector<T> wrapped)
    : wrapped(wrapped) {}

  template <class InIter>
  void Add(InIter first, InIter last)
  {
    std::copy(first, last, std::back_insert_iterator(wrapped));
  }

private:
  std::vector<T> wrapped;
};

然后在 Mesh 上公开这些实例,但这开始散发出一点过度设计的味道:P 非常感谢任何建议!


这些方法必须在头文件中定义

它们必须定义在a头文件,这样如果使用它们,那么它们就可以在实例化模板函数的翻译单元中使用。如果您担心头文件中的模板太多,会减慢使用 Mesh 但实际上不使用该模板函数的翻译单元的编译速度,那么您可以将实现移至单独的头文件中。让客户的生活稍微复杂一些,决定是否包含“full fat”类标头,但这实际上并不困难。

或者,对于这个特定的示例,您可以为网格定义一个输出迭代器,它会附加法线。然后具有任意迭代器的客户端可以执行以下操作:

std::copy(first, last, mymesh.normalAdder());

他们需要的唯一包含模板代码的标头是<algorithm>,他们很可能已经拥有了。

要自己做,返回的对象normalAdder()需要超载operator++() and operator*(),它本身需要返回一个代理对象(通常*this)它实现了operator=(const &Vector3)。这附加到法线向量上。但所有这些都是非模板代码,可以在您的 .cpp 文件中实现。

再次在这个例子中,normalAdder()可以回来std::back_inserter(this.normals);,一个模板来自<iterator>.

至于您是否需要担心它 - 我认为当编译时间急剧增加时,更常见的是由于不必要的依赖项,而不是由于标头中的少量模板代码。一些大型项目似乎需要采取严厉措施,但就我个人而言,我还没有处理过超过 100 个左右的文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 C++ 类进行 STL 化 的相关文章

  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 无法将字符串文字分配给装箱的 std::string 向量

    这是我的类型系统的简化版本 include
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 有人能解释一下吗:0.2 + 0.1 = 0.30000000000000004? [复制]

    这个问题在这里已经有答案了 重复项 浮点数是如何存储的 什么时候重要 https stackoverflow com questions 56947 how is floating point stored when does it mat
  • 如何对 numpy 字符串数组的每个元素进行切片?

    Numpy 有一些非常有用的字符串操作 http docs scipy org doc numpy reference routines char html 它将常用的 Python 字符串操作向量化 与这些操作相比pandas str n
  • 来自带有列表的字典的 Pandas DataFrame

    我有一个 API 它以 Python 字典的形式返回一行数据 大多数键都有一个值 但有些键的值是列表 甚至是列表的列表或字典的列表 当我将字典放入 pd DataFrame 并尝试将其转换为 pandas DataFrame 时 它 会抛出
  • 使用 FPDF 使文本在单元格中换行?

    现在 当我使用带有文本的单元格时 它全部保留在一行上 我知道我可以使用写入功能 但我希望能够指定高度和宽度 这就是我现在所拥有的 但正如我所说 文本不会换行以保留在尺寸中 pdf gt Cell 200 40 reportSubtitle
  • 为什么我们在 Hibernate 中使用 @Embeddable

    有什么用 Embedded and Embeddable处于休眠状态 因为我在互联网上找到的每个示例都是在单个表中插入数据并使用两个不同的类来执行此操作 我的观点是 如果我使用单个表 那么我可以映射单个类内的所有列 那么为什么我应该使用不同
  • 关闭mysql连接重要吗?

    关闭mysql连接效率是否至关重要 或者在php文件运行后它会自动关闭吗 来自文档 http us php net function mysql connect 注意 脚本执行结束后 到服务器的链接将立即关闭 除非通过显式调用 mysql
  • Xcode 4.4 约束错误

    我正在使用 Xcode 4 4 并在界面生成器中创建视图 当我运行我的应用程序时 我始终收到以下约束错误 Unable to simultaneously satisfy constraints
  • Realm React-Native:从 JS(反应本机代码)和 android(java)访问相同的领域

    我有一个用例 我在 android 代码 本机 中接收一些数据 我想将此数据插入到由我的反应代码打开或创建的同一领域中 或者在同一个领域写作 我怎样才能实现这个目标 感谢所有的帮助 附 我知道我可以以某种方式制作一个本机模块并将数据发送回我
  • 如何使用 JMH 按顺序运行基准测试中的方法?

    在我的场景中 基准测试中的方法应该在一个线程中顺序运行并按顺序修改状态 例如 有一个List
  • 在 API 网关路径中引用授权者定义

    我在我的 cloudformation 模板中定义了一个自定义授权者 MyCustomAuthorizer Type AWS ApiGateway Authorizer Properties Name MyCustomAuthorizer
  • MongoDB 中的多语言属性

    我正在尝试在 MongoDB 中设计一个模式范例 它将支持文档中变量属性的多语言值 例如 我有一个产品目录 其中每个产品可能需要以各种语言存储其名称 标题或任何其他属性 同样的范例可能也适用于其他特定于区域设置的属性 例如价格 货币变化 我
  • jquery数组分组依据

    我有这样的数组 abcArr A 10 B 20 A 30 C 40 如何按 A B C 对值进行分组和求和 each abcArr function if this 0 this 0 this 1 this 1 I know this w
  • 如何考虑标签将多行合并为一行

    我有一个数据框 每一行都包含一个句子 我想将这些行合并在一起 以便每行包含每个作者的 4 个句子 我有类似这样的数据框 text author sent1 x sent2 x sent3 x sent1002 x sent1 y sent2
  • 如何从一个表中选择另一表中不存在的所有记录?

    表1 ID 名称 表2 ID 名称 Query SELECT name FROM table2 that are not in table1 already SELECT t1 name FROM table1 t1 LEFT JOIN t
  • 两个linux内核模块之间是否可以通过netlink进行通信?

    众所周知 netlink是用户 内核空间的通信机制 我想从我的内核模块与另一个内核模块进行通信 另一个内核模块已经具有 netlink 接口 是否可以像我们在用户空间中那样从内核模块到 netlink 建立连接 简短回答 不 如果要在两个内
  • 证书颁发:来自 P7B 和 CRT 的 KEY 或 PFX

    我对证书很陌生 这是我第一次购买它 我生成了 CSR 文件 在 IIS 中 并使用 GoDaddy 网站购买了证书 他们给我发了两个文件 P7B 和 CRT 由于我将使用 Azure Web 角色的证书 因此我需要 PFX 如何仅使用 CS
  • 将 svn 存储库数据库格式从 1.6 降级到 1.5

    我确实遇到了一个不寻常的情况 因为我必须将 svn 存储库从 svn server 1 6 迁移到 svn server 1 5 问题是没有可用的降级工具 有人知道一些脚本或者有降级 svn 存储库的经验吗 Cheers Kevin 除了
  • 有没有办法预先缓存网页以便使用 Android WebView 查看?

    我读过有关 HTML5 缓存清单的内容 并且我看到 Android 确实支持使用缓存清单来缓存网站 我想使用缓存清单下载我的网站所需的所有资源以进行预加载 然后打开 WebView 并使用预缓存的资源显示远程网站 我想以某种方式预先缓存我的
  • 同时将 r 与 foreach 和 mclapply 并行

    我正在实现一个并行处理系统 该系统最终将部署在集群上 但我无法弄清楚并行处理的各种方法如何交互 我需要使用 for 循环来运行一大段代码 其中包含几个大的矩阵运算列表 为了加快速度 我想使用 foreach 并行化 for 循环 并使用 m
  • 对 C++ 类进行 STL 化

    我正在尝试编写一个包含多个 std vectors 作为数据成员的类 并提供向量接口的子集来访问它们 class Mesh public private std vector