问题标签 [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 回答
13855 浏览

c++ - “奇怪重复的模板模式”的实际用途

“奇怪重复的模板模式”有哪些实际用途?通常显示的“计数类”示例对我来说并不是一个令人信服的示例。

0 投票
7 回答
23798 浏览

java - Java 枚举定义

我以为我非常了解 Java 泛型,但后来我在 java.lang.Enum 中遇到了以下内容:

有人可以解释如何解释这个类型参数吗?提供可以使用类似类型参数的其他示例的奖励积分。

0 投票
5 回答
27689 浏览

c++ - CRTP 避免动态多态性

如何在 C++ 中使用 CRTP 来避免虚拟成员函数的开销?

0 投票
5 回答
105689 浏览

c++ - 不完整类型的无效使用

我正在尝试在我的项目中使用来自子类的 typedef,我在下面的示例中隔离了我的问题。

有谁知道我要去哪里错了?

这是我得到的输出:

0 投票
2 回答
864 浏览

c++ - C++ CRTP 问题,MSVC 错误 C2039

MSVC 2008 不会编译此代码:

我得到的错误是“错误C2039:'type':不是'D'的成员”。有任何想法吗?

0 投票
6 回答
2486 浏览

c++ - 我可以在这里使用奇怪重复的模板模式(C++)吗?

我有一个可以简化为这样的 C++ 应用程序:

我的应用程序对性能至关重要。集合中通常有数千个小部件。从(其中有几十个)派生的类AbstractWidget通常不会覆盖许多虚函数。那些被覆盖的通常具有非常快的实现。

鉴于此,我觉得我可以通过一些巧妙的元编程来优化我的系统。目标是利用函数内联并避免虚函数调用,同时保持代码的可管理性。我已经研究了奇怪重复出现的模板模式(请参阅此处进行描述)。这似乎几乎可以满足我的要求,但并不完全。

有什么方法可以让 CRTP 在这里为我工作吗?或者,还有其他任何人能想到的聪明的解决方案吗?

0 投票
2 回答
4632 浏览

c++ - 如何为所有派生类型部分专门化一个类模板?

std::tr1::hash我想为基类和所有派生类部分专门化我无法更改 () 的现有模板。原因是我使用奇怪重复的模板模式来实现多态性,并且哈希函数是在 CRTP 基类中实现的。如果我只想部分专注于 CRTP 基类,那很容易,我可以写:

但是这种特化与实际的派生类不匹配,只有CRTPBase<Derived>. 我想要的是一种为Derived当且仅当它派生自CRTPBase<Derived>. 我的伪代码是

...但这不起作用,因为编译器无法判断enable_if<condition, Derived>::typeDerived. 如果我可以更改std::tr1::hash,我会boost::enable_if按照文档的建议添加另一个要使用的虚拟模板参数enable_if,但这显然不是一个很好的解决方案。有没有办法解决这个问题?我是否必须在每个或我创建的每个unordered_set或我创建的自定义哈希模板上指定一个自定义哈希模板,或者为每个派生类unordered_map完全专门化?hash

0 投票
3 回答
1714 浏览

java - 如何在java中转换为CRTP?

我有一个非常简单的案例,我做了一些基本的通用分配:

Enum.valueOf()有点难以调用,在我的情况下,错误是:

java.lang.Enum 中的 valueOf(java.lang.Class,java.lang.String) 不能应用于 (java.lang.Class,java.lang.String)

这是完全有道理的,因为 type 是Class<Object>. 但是由于Enum是 CRTP,我找不到一个好的方法来转换类型以使编译器满意。使用原始类型Enum.valueOf((Class)type, example))是唯一的答案吗?它给了我 2 个警告,而不是只有一个。

0 投票
3 回答
2329 浏览

java - java中的枚举和泛型方法

java泛型系统中的一些极端情况仍然存在问题。

我有这个方法(我只对签名感兴趣):

(想想一个接口,它的实现有时会提取一个 EnumSet 有时一个实现会提取一个 JComboBox 等。)

我想用在运行时获得的类来调用它,所以我只是这样称呼它:

我收到一条奇怪的错误消息:找到不兼容的类型:java.lang.Object required: RETURN_TYPE

消息的位置,如果就在呼叫的开始之后,在类型的“t”之前。

如果我从非通用上下文中调用它,它可以工作:

请问有人对此问题有解释和解决方案吗?

这是一个完整的文件供想要玩它的人使用:

提前致谢,

尼科

0 投票
3 回答
2217 浏览

c++ - 从模板参数继承并在 C++ 中向上转换

我曾尝试在 VS2008 中使用此代码(并且可能在示例中包含了太多上下文......):

这按预期工作,即可以访问“A”成员函数并且 fooresult 返回 1。但是,当在 unittest 函数结束时删除对象时会引发异常:

System.AccessViolationException:试图读取或写入受保护的内存。这通常表明其他内存已损坏

如果我将 Current() 函数的返回类型更改为:

然后一切正常,单元测试以没有访问冲突结束。有人能告诉我第一个 Current() 实现有什么问题吗?谢谢,布谢。