问题标签 [crtp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
200 浏览

c++ - 从模板化父级访问子 typedef

为什么以下不编译?

那怎么Base不能访问它的子类型?我用静态函数而不是 typedef 进行了同样的尝试,效果很好。

我尝试了 GCC 4.4.2 和 clang 3.0。

0 投票
1 回答
2654 浏览

c++ - 使用通用侵入式指针客户端进行引用计数

介绍

Peter Weinhart 描述了如何使用 CRTP 设计一个通用的 intrusive_ptr 基类,它可以按如下方式使用:

这种方法强加了所有foo对象都带有引用计数器的约束。假设我们foo有时按值保留,并且只想在我们有指针时支付引用计数器的价格。例如,有时我们想创建foo实例并移动它们,有时我们想foo在堆上分配。

从概念上讲,这种情况的正确机制是std::shared_ptr. 但是,在某些情况下需要原始指针,这会调用侵入式指针,例如,当通过采用 void 指针的 C API 传递指针时。在这种情况下,在将指针传递给不透明 API 之前会“引用”指针,而在取回指针时会“取消引用”。

拥有控制权foo,最好的方法可能是使用基于策略的实现,并拥有一个引用计数和基本版本的foo. 在无法控制的情况下foo,另一种设计将反转继承关系:

在上面提到的文章中,Peter 说这样一个“[ intrusive] 的通用实现将利用 C++0x 可变参数模板和完美的转发。”

问题

这样一个泛型intrusive类的实现会是什么样子?我可以看到它可能会受益于 C++11 继承构造函数,但我不清楚实际上将如何实现intrusive使用上述工具的主体。

0 投票
1 回答
137 浏览

c++ - 命名空间内的 CRTP vs typdefs 和朋友

我与编译器战斗了一夜,我的想法已经用完了......

我在具有受保护功能的命名空间内有一个 CRTP 结构。派生类(也在该命名空间内)被定义为另一个名称。

旁边我有一个类(也类型定义为另一个名称),它带有一个尝试调用该函数的静态函数。所以我开始交朋友,但编译器(在我的例子中是 VS 2010)仍然不会让我访问该函数。

因为一些代码可能更清楚:

谁能告诉我我在这里没有看到什么以及如何解决这个问题?

干杯

0 投票
1 回答
401 浏览

c++ - 基于重载构造函数的策略类模板参数选择

我想要一个模板类根据传递给构造函数的类类型自动选择它的参数。对象已经有类型。

这些类型应该被构造函数理解

.

.

当可以从输入参数的类型中提取模板参数(策略)时,定义模板参数(策略)似乎是多余的。

0 投票
1 回答
323 浏览

c++ - 将 C++ 层次结构转换为使用静态多态性

我有以下类层次结构(实际上还有更多的类),我想知道是否可以重新组织以下内容以利用静态多态性?

我问,在进行了大量的分析之后,虚拟方法调用的开销实际上是相当大的,并且希望尽可能地优化它。

0 投票
1 回答
458 浏览

c++ - CRTP:表达式模板的编译器相关问题

我使用以下代码(存储在 crtp.cc 中)遇到了与编译器相关的问题:

事实上,当我编译它时:

我得到:

这是预期的行为。当我使用 icpc 时:

我获得了一个Segmentation fault. 跑步

指向源代码中的第 29 行

由于我对 C++ 很陌生,并且我花了很长时间寻找一个没有任何结果的错误,我想请教更有经验的人的意见,以了解这个问题是否是由于我引入的一些错误(如我所料)或到编译器错误。

编辑:在 Mike Seymour 的回答之后,我改变了现在的代码。现在我没有收到编译器警告,但我仍然得到与以前相同的行为(具有相同的 valgrind 响应)。有人尝试用 Intel 编译吗?

编辑:我试图在Wikipedia的Expression Templates页面中编译代码。我获得了与我提供的示例相同的行为。

编辑:我已经进一步调查了这个问题,似乎与英特尔一起编译icpc运营商

递归调用自身。我发现的一种解决方法是用一种方法替换此运算符:

并相应地修改各种类的构造函数。谁能指出这两种行为中哪一种是正确的,可能指向解释这一点的标准?

0 投票
2 回答
1066 浏览

c++ - 使用 static_cast 实现的转换运算符

在我在这里提出的问题之后,我提出了这个问题。

要点很简单。假设您有两个此类:

然后假设你有一个像这样的类型转换:

问题是:这种转换的标准符合行为应该是什么?

它应该与堆栈溢出相同const T & val(static_cast<const T &> (param) ) 还是应该递归迭代?请注意,我获得了使用 GNU 编译的第一个行为g++和使用 Intel 编译的第二个行为icpc

我已经尝试查看标准(关于 static_cast 的第 5.9 节和关于转换的第 12.3 节),但由于缺乏经验,我无法找出答案。

我非常感谢任何花时间帮助我解决这个问题的人。

0 投票
2 回答
164 浏览

c++ - CRTP 中间类也需要成为 final

我有一个 CRTP 类的继承链。CRTP 类相互派生,直到“最终”派生类将自身作为 CRTP 参数传递并最终确定继承链。

我想要做的是能够在 CRTP 继承链的每个级别都有这样的“最终”最终用户类,不涉及模板:

你可以猜到,这个 typedef 不起作用,因为它引用了自己定义的类型。问题是如何实现这一目标?我能想到的方法是:

正如代码中的注释所说,这不是一个非常优雅的解决方案 - 我需要重新定义构造函数以转发到基本构造函数。有谁知道更优雅的方式?

0 投票
2 回答
952 浏览

c++ - 奇怪地重复出现的模板 - 变体

关于CRP,如果我想实现它的轻微变化(使用模板模板参数),我得到一个编译错误:

我不确定有人会选择这种形式(它不会为我编译)而不是使用它(这行得通)

0 投票
2 回答
264 浏览

c++ - 检测 CRTP 基类的同级

我正在尝试使用boost::is_base_of以检测 CRTP 基类是否Generic可以识别其对等点,即T也派生自的类。

如中所示Generic<T>::init(),我想使用这些机制来允许类Generic<T>将指针添加到其对等函数之一Bar1Bar2T也从中派生)映射。不幸的是,无法检测到不派生自的boost::is_base_of类,例如。Bar3T

gcc 错误信息:

编辑

为这个问题提供一些背景。我正在尝试将指向setValue每个基类的方法的指针存储Foo<T>在映射中以便快速访问。调用的选择setValue取决于字符串,因此取决于地图。另一个类X可以继承Bar1Bar3但不能继承Bar2,和以前一样,我必须存储指向适当setValue的指针以便快速访问。Generic<T>旨在为 等 履行这个Foo角色X