问题标签 [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.
c++ - 从模板化父级访问子 typedef
为什么以下不编译?
那怎么Base
不能访问它的子类型?我用静态函数而不是 typedef 进行了同样的尝试,效果很好。
我尝试了 GCC 4.4.2 和 clang 3.0。
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
使用上述工具的主体。
c++ - 命名空间内的 CRTP vs typdefs 和朋友
我与编译器战斗了一夜,我的想法已经用完了......
我在具有受保护功能的命名空间内有一个 CRTP 结构。派生类(也在该命名空间内)被定义为另一个名称。
旁边我有一个类(也类型定义为另一个名称),它带有一个尝试调用该函数的静态函数。所以我开始交朋友,但编译器(在我的例子中是 VS 2010)仍然不会让我访问该函数。
因为一些代码可能更清楚:
谁能告诉我我在这里没有看到什么以及如何解决这个问题?
干杯
c++ - 基于重载构造函数的策略类模板参数选择
我想要一个模板类根据传递给构造函数的类类型自动选择它的参数。对象已经有类型。
这些类型应该被构造函数理解
是
.
是
.
是
当可以从输入参数的类型中提取模板参数(策略)时,定义模板参数(策略)似乎是多余的。
c++ - 将 C++ 层次结构转换为使用静态多态性
我有以下类层次结构(实际上还有更多的类),我想知道是否可以重新组织以下内容以利用静态多态性?
我问,在进行了大量的分析之后,虚拟方法调用的开销实际上是相当大的,并且希望尽可能地优化它。
c++ - CRTP:表达式模板的编译器相关问题
我使用以下代码(存储在 crtp.cc 中)遇到了与编译器相关的问题:
事实上,当我编译它时:
我得到:
这是预期的行为。当我使用 icpc 时:
我获得了一个Segmentation fault
. 跑步
指向源代码中的第 29 行
由于我对 C++ 很陌生,并且我花了很长时间寻找一个没有任何结果的错误,我想请教更有经验的人的意见,以了解这个问题是否是由于我引入的一些错误(如我所料)或到编译器错误。
编辑:在 Mike Seymour 的回答之后,我改变了现在的代码。现在我没有收到编译器警告,但我仍然得到与以前相同的行为(具有相同的 valgrind 响应)。有人尝试用 Intel 编译吗?
编辑:我试图在Wikipedia的Expression Templates页面中编译代码。我获得了与我提供的示例相同的行为。
编辑:我已经进一步调查了这个问题,似乎与英特尔一起编译icpc
运营商
递归调用自身。我发现的一种解决方法是用一种方法替换此运算符:
并相应地修改各种类的构造函数。谁能指出这两种行为中哪一种是正确的,可能指向解释这一点的标准?
c++ - 使用 static_cast 实现的转换运算符
在我在这里提出的问题之后,我提出了这个问题。
要点很简单。假设您有两个此类:
然后假设你有一个像这样的类型转换:
问题是:这种转换的标准符合行为应该是什么?
它应该与堆栈溢出相同const T & val(static_cast<const T &> (param) )
还是应该递归迭代?请注意,我获得了使用 GNU 编译的第一个行为g++
和使用 Intel 编译的第二个行为icpc
。
我已经尝试查看标准(关于 static_cast 的第 5.9 节和关于转换的第 12.3 节),但由于缺乏经验,我无法找出答案。
我非常感谢任何花时间帮助我解决这个问题的人。
c++ - CRTP 中间类也需要成为 final
我有一个 CRTP 类的继承链。CRTP 类相互派生,直到“最终”派生类将自身作为 CRTP 参数传递并最终确定继承链。
我想要做的是能够在 CRTP 继承链的每个级别都有这样的“最终”最终用户类,不涉及模板:
你可以猜到,这个 typedef 不起作用,因为它引用了自己定义的类型。问题是如何实现这一目标?我能想到的方法是:
正如代码中的注释所说,这不是一个非常优雅的解决方案 - 我需要重新定义构造函数以转发到基本构造函数。有谁知道更优雅的方式?
c++ - 奇怪地重复出现的模板 - 变体
关于CRP,如果我想实现它的轻微变化(使用模板模板参数),我得到一个编译错误:
我不确定有人会选择这种形式(它不会为我编译)而不是使用它(这行得通)
c++ - 检测 CRTP 基类的同级
我正在尝试使用boost::is_base_of
以检测 CRTP 基类是否Generic
可以识别其对等点,即T
也派生自的类。
如中所示Generic<T>::init()
,我想使用这些机制来允许类Generic<T>
将指针添加到其对等函数之一Bar1
或Bar2
(T
也从中派生)映射。不幸的是,无法检测到不派生自的boost::is_base_of
类,例如。Bar3
T
gcc 错误信息:
编辑
为这个问题提供一些背景。我正在尝试将指向setValue
每个基类的方法的指针存储Foo<T>
在映射中以便快速访问。调用的选择setValue
取决于字符串,因此取决于地图。另一个类X
可以继承Bar1
,Bar3
但不能继承Bar2
,和以前一样,我必须存储指向适当setValue
的指针以便快速访问。Generic<T>
旨在为 等 履行这个Foo
角色X
。