问题标签 [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 投票
1 回答
2397 浏览

c++ - 在向量中存储基于 CRTP 的类时遇到问题

我不确定这是否可以做到,我只是深入研究模板,所以也许我的理解有点错误。

我有一个士兵排,排从一个编队继承来获取编队属性,但是因为我可以拥有尽可能多的编队,所以我选择使用CRTP来创建编队,希望我可以制作一个用于存储排的向量或排数组。但是,当然,当我制作排时,它不会将其存储在向量中,“类型不相关”

有没有办法解决 ?我读到了类似的“单板”,它们与数组一起工作,但我无法让它工作,也许我错过了一些东西。

这是一些代码:(对不起格式,代码在我的帖子中,但由于某种原因没有显示)

然后我在 platoon 类中使用这些编队进行派生,以便 platoon 获取相关的 SetupFormation() 函数:

到目前为止,一切都很好,并且符合预期。

现在,由于我的将军可以有多个排,我需要存储排。

typedef 排< IFormation<> > TPlatoon; 失败,因为我需要指定一个模板参数,但指定它只会让我存储使用相同模板参数创建的排。

所以我然后创建了FormationBase

并使 IFormation 公开继承,然后将 typedef 更改为

但还是没有爱。

现在在我的搜索中,我没有找到表明这是可能或不可能的信息。

0 投票
1 回答
423 浏览

c++ - 在多文件程序中使用“奇怪重复的模板模式”

我是一个非常新手 (C++) 程序员,并且刚刚发现了 CRTP 用于记录属于特定类的对象的计数。

我是这样实现的:

这似乎有效。但是,它似乎不喜欢在一个单独的头文件中继承它,我在其中声明了这一点:

没有继承,一切都编译得很好,所以我很确定它看不到模板的声明和定义。有人对我可能出错的地方以及我能做些什么有任何建议吗?我应该在我的 Infector 定义之前使用 extern 来让编译器知道 Counter 模板或类似的东西吗?

干杯,

凯尔

0 投票
1 回答
605 浏览

c++ - CRTP 和模板化表达式

在使用模板化表达式和好奇递归模板模式 (CRTP) 的复杂库中,我需要一些重载运算符来专门用于基类,但涉及其派生类的操作找不到基类专门化。

IE:

  • 如果为 BaseA< T > + BaseA< T > 定义了运算符,则代码 DerivedA< T > + DerivedA< T > 发现该运算符没有问题。
  • 如果为 BaseB< T > + BaseB< T > 定义了运算符,则代码 DerivedB< T > + DerivedB< T > 发现该运算符没有问题。
  • 但是如果为 BaseB< BaseA< T > > + BaseB< BaseA< T > > 定义了运算符,则 DerivedB< DerivedA< T > > + DerivedB< DerivedA< T > > 找不到该运算符。

如何确保找到专门的嵌套案例的运算符?

我可以这样重申这个问题:

如果我有课(使用 CRTP)

我有一个接线员

它很乐意用于求解函数 DerivedB< DerivedA< double >> + DerivedB< DerivedA< double> >,例如

但是如果我有一个更专业的操作员来进行相同的操作

同一函数未找到此运算符

如何确保找到专门的操作员来解决此功能?

我附上了重现问题的简化代码,只有一行 BA1+BA2; 不使用 g++ 编译。

完整代码示例:

0 投票
4 回答
1698 浏览

c++ - 使用虚拟析构函数会使非虚拟函数进行 v-table 查找吗?

正是主题所要求的。还想知道为什么 CRTP 的常见示例中没有提到virtualdtor。

编辑:伙计们,请也发布有关 CRTP 问题的信息,谢谢。

0 投票
3 回答
746 浏览

delphi - Delphi 泛型类可以从其类参数继承吗?

我一直在尝试定义一个通用的、可继承的 TSingleton 类。这是我正在进行的:

目标是能够在继承树中“插入”单例模式。所以不要声明这样的东西:

并且需要在那里实现单例模式,我会声明如下:

可悲的是,这行不通。我收到以下错误(在 D2010 中):

现在我想知道,这可以在 Delphi XE 中使用吗?是否有一些“干净的技巧”可以用来在 D2010 中完成这项工作?有一些根本原因导致这行不通吗?

0 投票
3 回答
2983 浏览

c++ - 派生类作为模板参数有什么用?

这种模式的目的是什么?这叫什么?我第一次看到它时看起来很奇怪,虽然我现在已经看过很多次了。

0 投票
6 回答
55758 浏览

c++ - 什么是奇怪的重复模板模式(CRTP)?

在不参考一本书的情况下,任何人都可以CRTP通过代码示例提供一个很好的解释吗?

0 投票
3 回答
611 浏览

c++ - CRTP 失败 w/decltype

对我来说似乎很简单。但是 MSVC 无法编译。

即使编译器很乐意接受调用该函数。下面的示例编译得很好。

我在尝试使用模板参数中的任何类型时遇到了同样的问题。

而 B 类清楚地定义了一种称为“某物”的类型。编译器非常乐意在 T、T& 或 T* 类型的对象上调用函数,但我似乎无法从 T 访问任何类型。

0 投票
5 回答
1768 浏览

c++ - 使用 CRTP 时如何避免错误?

有时我会使用CRTP编写如下代码:

而且很难理解出了什么问题,直到我在调试器中跟踪代码并看到 Bar 的成员没有在Base.

如何在编译时显示此错误?

(我用的是MSVC2010,所以可以使用一些C++0x特性和MSVC语言扩展)

0 投票
2 回答
460 浏览

c++ - 这是静态多态性的 CRTP 用法,但没有实现派生函数。在 gcc 和 Visual Studio 中编译。为什么?

后续问题:如何使这种类型安全?也就是说,如果有人忘记实现方法 2,我希望编译器能够捕捉到它。我不希望它在运行时爆炸。