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

c++ - 如何在 CRTP 中实现向下转换是否有效的编译时检查?

我有一个普通的旧 CRPT(请不要被访问限制分心 - 问题不在于它们):

像往常一样打算这样使用:

现在这static_cast让我很困扰。我需要一个向下转换(不是向上转换),所以我必须使用显式转换。在所有合理的情况下,转换都是有效的,因为当前对象确实属于派生类。

但是,如果我以某种方式改变了层次结构并且演员现在变得无效怎么办?

在这种情况下,我可以以某种方式强制执行显式向下转换是否有效的编译时检查吗?

0 投票
1 回答
748 浏览

java - Java 泛型 - 我如何阅读:Foo>>?

我正在使自己了解 Java 泛型(甚至在 JDK 1.4... 1.3 的遗留代码上工作了很长时间),但我不太明白这一点:

WhereFooBar是两个通用类。

这怎么理解,因为我不太明白?

我已经阅读了很多关于 Java 泛型的内容,但这有点让人费解(至少对于我这个初学者来说)。

0 投票
5 回答
14658 浏览

c++ - C++ 静态多态性 (CRTP) 和使用派生类的 typedef

我阅读了Wikipedia 文章,其中介绍了 C++ 中用于执行静态(阅读:编译时)多态性的奇怪重复模板模式。我想对其进行概括,以便可以根据派生类型更改函数的返回类型。(这似乎应该是可能的,因为基类型知道模板参数的派生类型)。不幸的是,以下代码无法使用 MSVC 2010 编译(我现在无法轻松访问 gcc,所以我还没有尝试过)。有谁知道为什么?

顺便说一句,我有一个使用额外模板参数的解决方法,但我不喜欢它——当将许多类型传递到继承链上时,它会变得非常冗长。

编辑:

MSVC 2010 在这种情况下给出的错误消息是error C2039: 'value_type' : is not a member of 'derived<T>'

g++ 4.1.2(通过codepad.org)说error: no type named 'value_type' in 'class derived<int>'

0 投票
2 回答
293 浏览

c++ - 使用现代 c++ 编译器内联的“奇怪重复模板模式”的类中的方法

我有一段性能关键的代码,我正在考虑使用 CRTP。我的问题是大多数编译器能够在多大程度上优化代码。特别是我想知道编译器是否可以内联(在适当的时候)方法。例如,在以下代码中:

object.interface()产生与调用相同的性能的调用object.implementation()

0 投票
4 回答
599 浏览

c++ - CRTP 子类和实例列表

我正在尝试实现一种具有多重继承的 CRTP(如果我很了解它是什么)。

我的主要目标是有一个统一的方式来访问每个子类的实例列表。

可能问题似乎存在于命名空间的使用上。

这是最简单版本的代码:http: //ideone.com/rFab5

我真正的问题更类似于:http: //ideone.com/U7cAf

我有一个使用 clang++ 的额外警告:

问题已更新,因为它使用命名空间的行为不同。

重新编辑问题以在 Ideone 上发布代码

0 投票
4 回答
446 浏览

c++ - 这种过载解决头痛的原因是什么?

我有一个程序,其中有很多嵌套的 if/switch 语句,这些语句在多个地方重复。我尝试将其提取出来并将开关放在模板方法类中,然后允许客户端使用重载来重载他们想要专门处理的开关分支:

但是,这无法编译(至少在ClientMergeFooTwo's 的情况下),说它不能将 Foo& 转换为 SpecificFoo&。任何想法为什么它失败了转换而不是选择完美的通用重载MergeFoo

编辑:好吧,考虑到我尝试编写它的速度,这个伪代码示例显然做得不太好。我已经纠正了一些错误...

0 投票
2 回答
1111 浏览

c++ - CRTP 能否完全替代小型设计的虚拟功能?

CRTP是否有能力virtual完全超越功能?

我看到的 CRTP 的唯一缺点是为每个重复模式生成的大量代码。对于较小的设计(其中 2-3 个类派生自一个基类),CRTP 是一个更好的主意吗?

0 投票
4 回答
4149 浏览

c++ - CRTP 避免虚拟成员函数开销

CRTP中为了避免动态多态性,为了避免虚成员函数的开销并强加一个特定的接口,提出了以下解决方案:

然而,派生类似乎不需要定义来编译,因为它继承了一个(代码编译良好,无需定义 my_type::foo)。事实上,如果提供了一个函数,那么在使用派生类时将不会调用基函数。

所以问题是,以下代码替换是否可以接受(和标准?):

0 投票
1 回答
636 浏览

reflection - How to get generic type definition for CRTP type

Given the following CRTP type in C#:

How would I get its generic type definition in F#?

yields the error:

Type constraint mismatch when applying the default type 'DataProviderBase<'a>' for a type inference variable. The resulting type would be infinite when unifying ''a' and 'DataProviderBase<'a>' Consider adding further type constraints

In C#, it would be:

UPDATE

I found a workaround:

Is there another way to do it, without the extra type?

0 投票
2 回答
110 浏览

c# - 我可以将类型限制为仅包含可为空的属性吗?

我有这样的类,其中所有属性都必须是可为空的类型。是否可以为 Sessions 类属性添加设计(而不是运行时)时间验证以检查是否添加了新属性具有可为空的类型?如果属性不具有可空类型,编译器应该给出错误并且不编译代码。