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

c++ - 重用复制和交换习语

我正在尝试将复制和交换习语放入可重用的混合中:

我打算通过 CRTP 将其混合:

但是,一个简单的测试表明它不起作用:

这只会打印两次“default”,既不打印“copy”也不打印“swap”。我在这里想念什么?

0 投票
3 回答
314 浏览

c++ - typedef 上与 CRTP 相关的编译器错误

我想我有一个相当简单的关于CRTP的问题,但我似乎找不到答案。大概是因为太简单了,没有人想过要问。我是这个概念的新手,所以,请不要笑得太厉害;)。

这是代码(这是一种类似于 STL 容器的尝试):

如果我评论有问题,一切都会编译typedef typename _THelpee::T Th;。这让我感到困惑:如果编译器不喜欢typedef typename _THelpee::T Th;,为什么它会通过static_cast< _THelpee* > ( this )->mVal?我认为,这与实例化THelper时无法实例化有关TDerived,但没有清楚的理解。有人可以就这里发生的事情给出一个简短的解释和/或一些参考吗?谢谢你。

编辑:删除 '_T' 前缀。

0 投票
2 回答
1597 浏览

c++ - CRTP 容器

我正在学习一些模板编程,对此我很陌生。我想要实现的是一些包含 STL 容器的 CRTP 类。让我们class A{};作为(编译时)基类的示例,在编译时遵循 CRTP 样式从该基类“派生”class B{};和“派生”。class C{};

现在两者都BC包含容器。为了示例的目的,让它分别为 astd::vector和 a std::set。现在,我想通过 abegin()和一个end()公开前向迭代器的函数公开这些迭代器。但是,我不想暴露里面的确切容器是什么BC并且我想为 定义这些函数A,以便在调用时正确的一个用于B并被C使用。

这可能吗 ?现在我的计划是有一个Iterator内部类,它将包含(BC情况而定的向量或集合)的实际迭代器并将调用委托给它。然而,这似乎是很多复制的胶水代码,我怀疑有更好的选择。

我有一些问题:

  1. 如何在 中声明内部 clases A,以便它与 CRTP 很好地配合BC我需要为 和 复制ABC?它可以是一个空类,我用专门的实现A将它们掩盖起来吗?BC

  2. 如何使用更少的胶水和更少的重复来公开迭代器?

我不想与外部库(如 boost)创建依赖关系,并且只想坚持使用 std。所以我必须自己实现我需要的任何额外功能。感谢所有的帮助。

0 投票
1 回答
738 浏览

c++ - CRTP 与直接实现“派生”中的功能

我正在努力更好地了解 CRTP。到目前为止,我的理解是它允许编写如下函数。

现在,根据x传递给函数的实际编译时派生对象foo(),它会做不同的事情。

但是,我可以从该类派生DerivedBase使用do_stuff()非虚拟但被覆盖的Derived::do_stuff. 因此,什么时候使用 CRTP 是正确的,而不是最简单的非平凡示例,它显示了 CRTP 相对于阴影/遮罩的优势。

0 投票
2 回答
139 浏览

c++ - 如何在编译或运行时检测非虚拟覆盖

我想检测一个函数是否(静态)在派生类中被覆盖:

显然,如果它没有覆盖,我不会调用'func'。我更喜欢直接回答我的问题。讲述实际问题以确定过载。我还将感谢任何显示解决一般问题的其他方法的答案。

好的,它编译,我还没有找到我的实际代码的区别,那没有。顺便说一句,在我的实际代码中,我不只是试图避免调用该函数,还有更多。我真的很想知道该函数是否被覆盖,或者我是否需要使用完全不同的方法。

0 投票
4 回答
749 浏览

c++ - 使用带有多个模板参数的 CRTP 时如何声明模板默认值?

我想要做:

但显然BattleData没有声明,所以我尝试了前向声明:

但后来我得到

错误:“第二行模板参数的数量错误,带有 BattleData。

我真的看不到解决方案!

编辑

我这样做的原因是因为我希望能够BattleData直接用作 a class,但我也希望能够对其进行子类化,在这种情况下,我必须将派生指定class为第二个template参数。

例如,假设我BattleData班的语料库是:

我有一个子类

在某些情况下,我仍然希望能够编写如下代码:

如果不能使用默认参数,我什至无法执行以下操作:

一方面,BattleData 类中没有虚拟化函数的原因是没有虚拟函数的好处。它对我不起作用的另一个原因是,只有当它们存在于派生类型中时,父 CRTP 类之一才会调用函数(使用decltype(Derived::function)和 enable-if 类似的结构),否则会回退到默认行为。由于可能存在大量具有特定设计模式的函数(例如 CRTP,它读取具有许多不同案例的协议并仅在派生类指定相应函数时以特定方式处理案例,否则只需传输它而不进行处理)。

所以这些函数可以存在也可以不存在SubBattleDataBattleData但是如果实例化,这两个类都可以正常工作,但不可能实例化BattleData

0 投票
1 回答
476 浏览

c++ - 具有奇怪重复模板模式的数组?

我有一个基于 CRTP 的 Windows 包装器HANDLE

我遇到的麻烦是,我不知道???上面可以用什么代替。我不能说HandleT<T>,因为它们可以是不同类型的句柄,它们不适合数组。而且我不想说HANDLE,因为这样该函数根本不会对HandleT对象起作用——用户不妨完全避免调用包装器。而且我不能使用可变参数模板,因为我还处于 C++0x 之前的世界。

这个问题有已知的解决方案,还是我只需要使用上面提到的非理想解决方案?

0 投票
1 回答
125 浏览

c++ - 使用 mixin (?) 使流 i/o 更容易

由于与我一起使用通用代码的许多学生在理解正确的流运算符重载方面存在一些问题,因此我尝试创建一个帮助模板(不知道这是否是一个真正的 mixin)来简化代码并确保正确的运算符实现。它来了:

继承类:

就我目前所看到的而言,这种实现的缺点:

  • 不适用于第 3 方类型
  • 包括继承,因此与 IoClass 紧密耦合,尽管不是每个用户都可能需要某种类型的 Io

起起伏伏:

  • 有用 ;-)
  • 可以添加类似的流类,而无需修改所有类,也无需为每个类编写特定的新代码

由于我在使用 mixin 方面不是很有经验,并且偶尔会违反编码准则,所以我想知道这是否是 mixin 的适当用法,或者如何使用另一种更合适的方法获得类似的效果技术。

非常感谢,马丁

0 投票
1 回答
340 浏览

c++ - 具有参数化基类的 C++ CRTP?

我正在尝试使用 CRTP,但变化很小。我有一个派生类模板,并希望将其应用于多个基类。但这要么是不可能的,要么就是我无法正确使用语法。以下代码无法编译,但希望能说明我想要实现的目标:

这可以做到吗?

编辑:

我想在这里实现什么?

我重命名了上面的一些代码以使用“狗和猫”的比喻。可能存在以下功能:

但是Wrapper会包含狗和猫通用的构造函数和运算符。一种倒置多态,其中基类具有专业化。这样做的原因是构造函数和运算符不必为每个特化重写或转发。

0 投票
3 回答
262 浏览

c++ - Matching CRTP in template class

lately I've been toying around with templates and stumbled upon the following problem. I am implementing the CRTP pattern like this:

I now would like to match instances of class protocol_object in a member template function, while still accepting non CRTP-types:

Unfortunately only the second version is ever called. Apparently match(protocol_object<derived_t> &value) is not considered or rejected in favour of the more general form match(T &value).

Is there a way out of this?

Thanks for any hints. Arne