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

c++ - C++ 错误枚举和 CRTP

errro : 错误 C2039: 'BROKER' : 不是 broker_def::brokerDisTradable 的成员'

任何想法?

谢谢!

0 投票
2 回答
1027 浏览

c++ - 在 CRTP 基类中的后期指定返回中使用 decltype

我正在尝试在 CRTP 基类中的成员函数的后期指定返回中使用 decltype 并且它的错误是:invalid use of incomplete type const struct AnyOp<main()::<lambda(int)> >

我基本上是在尝试将所有 sfinae 样板移动到一个基类中,所以我不需要为我创建的每个操作重复它(目前每个操作有 6 个不同的调用,并且有大约 50 个操作,所以有很多enable_if 有很多重复)。

我尝试了一个依赖于重载的解决方案,但是可以传递的类型之一是我绑定到 std 的任何可调用的类型(这可以是来自 C++03 的常规函子或 C++0x lambda): :function,不幸的是,std::function 的开销虽然非常小,但实际上对这个应用程序产生了影响。

有没有办法解决我目前拥有的问题,或者是否有更好的解决方案一起解决这个问题?

谢谢。

0 投票
2 回答
1216 浏览

c++ - 确定类型是否派生自 CRTP 基类

我正在尝试创建一个is_foo函数,然后我可以使用 withenable_if来确定类型是否派生自某个 CRTP 基类。下面的代码是我实现该功能的尝试is_foo,但它实际上不起作用。有人能告诉我我需要改变什么来修复它吗?

谢谢。

0 投票
1 回答
1557 浏览

c++ - C++:使用 CRTP,派生类中定义的类在基类中不可访问

这是(简化的)基类:

这是派生的:

是否有任何解决方法可以从SharedObject访问ThisWontCompile::Data?从基础对象派生的对象究竟能做什么,不能做什么?

0 投票
5 回答
718 浏览

c++ - 使用“Curiously Recurring Template Pattern”的增量数

我想实现一个class Address,在创建时将其字段初始化addr为唯一值。每次创建Address实例时,该值都必须增加一。

让我们举个例子。执行以下代码后:

x.addr应该是1,而y.addr应该是2。

为了实现这一点,我想到了奇怪重复的模板模式。是否可行?此外,是否有更简单的方法来实现相同的行为?

蒂亚,吉尔

0 投票
1 回答
275 浏览

c++ - 奇怪的重复模板?

我有一个问题,奇怪的是重复出现的模板可以很好地提供帮助,但我什至无法通过一个简单的测试。

这会导致错误

我错过了什么。

用 g++ 4.2.1 编译

0 投票
3 回答
3287 浏览

c++ - 使用带有附加类型参数的奇怪重复模板模式 (CRTP)

我尝试使用 Curiously Recurring Template Pattern (CRTP) 并提供额外的类型参数:

这可能是一个错误,更合适的超类应该是Base<A, double, int>——尽管这种参数顺序不匹配并不那么明显。如果我可以在 typedef 中使用 name 参数的含义,这个 bug 会更容易看出:

但是,这不能在 gcc 4.4 上编译,报告的错误在上面的注释中给出——我认为原因是在创建 A 之前,它需要实例化 Base 模板,但这反过来又需要知道 A。

在使用 CRTP 时是否有一种很好的方法来传递“命名”模板参数?

0 投票
2 回答
191 浏览

c++ - C++03 中后期绑定接口的设计模式

在某些情况下,您希望使用一个类作为接口的实现,但您不能修改代码或封装这个类(例如,从它派生)。在其他情况下,您可能希望抢占这种情况。// 让我们假设以下示例,我们有以下“密封”类,其中我们无法更改代码:

基本上有两种设计模式可供您选择: 1.) 作为接口的成员对象实现。

由于 C++03 模板的功能,这是非常类型安全的。许多编译器将内联“实现”的实际调用的成员函数 - 不幸的是,不是每个编译器。在某些情况下,我们必须处理不必要的调用。

2.) 使用 CRTP 模式而不从基础派生。

是的,我知道:这不是使用 CRTP 模式的正常方式。通常我们会这样定义:

不幸的是,我们不能这样做。请记住,我们不能更改实现类的代码。让我们考虑一下在我的 CRTP 模式版本中使用 my_interface1 到底会发生什么。在编程语言 C++03 的理论中,将派生类指针强制转换为他的基类之一是安全的。另一方面,在相反的方向(从基础到派生)或完全不同的类型进行转换是不安全的。不能保证内存对象已为基类和派生类保留了所需的字节数。但是,实际上,这不属于这个示例,因为我们的接口不包含任何成员。因此,它的大小是 0 字节(请注意 operator new 确实分配了至少 1 字节,即使类为空时也是如此)。在这种情况下,它' s - 实际上 - 将任何类型指针转换为 'my_interface1 指针是安全的。决定性的优势是,几乎每个编译器都会内联对实际调用的成员函数的调用。

那么,您认为最佳实践是什么?此致。

0 投票
4 回答
189 浏览

java - 将方法声明为“return this”的任何好方法?

像这样的东西:

好吧,我知道这在 Java 6 中是不可能的,所以我很高兴听到我是否可以在 Java 7 中做到这一点。

编辑

这对于链接方法调用应该很有用,并避免创建临时局部变量,如下所示:

还有更多。

我认为将这个函数添加到编译器应该很容易,也许我应该破解openjdk或gcj?

顺便说一句,我从来没有成功重建过openjdk。

0 投票
3 回答
6054 浏览

c++ - 模板化类中没有名为 X 的类模板

尝试使用 GCC 4.6.0 编译此(类似 CRTP)代码时:

我收到错误消息“test.cpp:3:26: error: no class template named 'X' in 'struct B<int>'”。为什么 X 在类定义之外似乎是不可见的?