crtp相关内容

使用CRTP的转发构造器

我使用带有CRTP的模板类来实现克隆模式,并使用第二个模板参数Base来支持多个级别的继承。尝试调用间接基类的构造函数时遇到编译器错误。 class B { public: B() {} //trivial constructor virtual B* clone()=0; }; template class Clona ..
发布时间:2022-04-08 20:42:52 C/C++开发

策略类设计,但没有使整个用户类成为模板

考虑以下代码,其中 Writer_I 充当接口.其他符合以正确形式编写元素类型的约定的类可以从它派生.这里,printf 和流被选为策略,Calculator 作为用户. 该接口以某种方式存储在 Calculator 中,而 write_i 隐藏了模板的所有丑陋细节,以便类成员函数保持干净.大多数事情在编译时仍然是已知的,并且可以内联. 我知道这是基于虚拟 + 派生的多态性的经典案例, ..
发布时间:2022-01-24 16:44:00 C/C++开发

CRTP 和动态多态性编译错误

A 类 {虚拟 A* foo() = 0;};模板B类:公共A {虚拟 T* foo() { return nullptr;}};C类:公共B{}; 这是混合可能性的简化实现复合模式和奇怪重复的模板模式.我收到以下错误: 虚函数'foo'的返回类型与它覆盖的函数的返回类型不协变('C *'不是从'A *'派生的) 在 clang 3.0、gcc 4.7 和 Visual Stu ..
发布时间:2022-01-24 16:38:28 C/C++开发

operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数在 C++ 中没有被继承.但显然,赋值 operator= 不是太...... 这是什么原因? 是否有任何解决方法可以继承赋值运算符? operator+=, operator-=, ... 也是这种情况吗? 是否继承了所有其他函数(除了构造函数/operator=)? 事实上,我在做一些CRTP时遇到了这个问题: template班级 ..
发布时间:2021-12-17 19:22:35 C/C++开发

不完整类型的无效使用

我试图在我的项目中使用来自子类的 typedef,我已经在下面的示例中隔离了我的问题. 有人知道我哪里出错了吗? templateA类{上市://为什么不喜欢这个?void action(typename Subclass::mytype var) {(static_cast(this))->do_action(var);}};B类:公共A{上市:typedef int mytype ..
发布时间:2021-12-13 18:53:19 C/C++开发

“Curiously Recurring Template Pattern"的实际用途

“Curiously Recurring Template Pattern"有哪些实际用途?常见的“计数类"示例对我来说并不是一个令人信服的示例. 解决方案 模拟动态绑定.避免虚拟函数调用的成本,同时保留一些层次结构的好处,对于子系统来说是一个巨大的胜利,在我目前正在进行的项目中可以做到这一点. ..

CRTP 避免动态多态

如何在 C++ 中使用 CRTP 来避免虚成员函数的开销? 解决方案 有两种方法. 第一个是通过静态指定类型结构的接口: template 结构基{无效的 foo() {static_cast(this)->foo();};};struct my_type : base{无效的 foo();//需要编译.};struct your_type : base{无效的 foo();//需 ..
发布时间:2021-12-13 18:31:49 C/C++开发

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

我阅读了 维基百科文章,内容涉及 C++ 中奇怪的重复模板模式,用于执行静态(阅读:编译时)多态性.我想概括它,以便我可以根据派生类型更改函数的返回类型.(这似乎应该是可能的,因为基类型知道模板参数的派生类型).不幸的是,以下代码无法使用 MSVC 2010 进行编译(我现在无法轻松访问 gcc,所以我还没有尝试过).有人知道为什么吗? 模板类基{上市:typedef typenamederiv ..
发布时间:2021-12-13 18:22:21 C/C++开发

Java 枚举定义

我以为我很了解 Java 泛型,但后来我在 java.lang.Enum 中发现了以下内容: class Enum> 有人能解释一下如何解释这个类型参数吗?提供可以使用类似类型参数的其他示例的奖励积分. 解决方案 这意味着 enum 的类型参数必须从本身具有相同类型参数的 enum 派生.这怎么会发生?通过使类型参数成为新类型本身.因此,如果我有一个名为 StatusCode 的枚举, ..
发布时间:2021-11-25 13:51:08 Java开发

C++ CRTP 类层次结构

来自维基百科: //奇怪重复出现的模板模式(CRTP)模板 结构基{//...};结构派生:基{//...}; 现在如果我想要derived_from_derived,我可以写: //奇怪重复出现的模板模式(CRTP)模板 结构基{//...};模板 结构派生:base{//...};结构派生_从_派生:派生的{//...}; 现在假设我只想要一个 deriv ..
发布时间:2021-09-04 20:48:03 C/C++开发

CRTP 类中派生类型成员的使用

我有一个奇怪的重复模板模式类和一个像这样的派生类: templateA类{typedef typename Derived::C D;Dx;};B类:公共A{民众:C类{};}; 由于在编译器尝试定义 D 时未完全定义 B,因此无法编译.如何获得类似的结果,即 A 的成员属于 B 中定义的类型?还是我必须强制在 B 之外定义 C? 解决方案 或者我是否必须强制在 B 之外定义 ..
发布时间:2021-09-04 20:44:36 C/C++开发

类静态变量初始化的规则是什么?

我有一些遗留代码,我需要为消息添加一个新类(这与我的问题无关).但事实证明,我需要声明一个空的构造函数才能初始化一些静态.不是默认构造函数或编译器提供的,而是用户定义的空.我试图将代码减少到 MWE,我得到了: #include 使用命名空间标准;结构测试{测试(){cout ..
发布时间:2021-08-28 18:42:05 C/C++开发

在 C++ 中迭代类继承

假设我有一个类架构(类的数量在开发期间不断增加),每个类都继承自 N 个具有相同基本接口的类.创建将迭代继承的基函数(在基类或派生类中)的最佳方法(如果可能)是什么? 目标:避免开发人员的错误,并确保我们不会忘记从所有继承中调用所有基本函数使代码更清晰易读. 请查看更新状态的编辑说明 简短示例: class shared_base {上市:虚拟无效功能()= 0;}类 base ..

Java中CRTP的替代品

CRTP 模式允许模仿所谓的 AbstractFoo 和 C3 的所有代码,只要它们不执行任何不安全的强制转换,它们仍然是完全类型安全的. AbstractFoo 中 SELF 的边界意味着该代码可以依赖于 SELF 是 AbstractFoo ,但是代码不能依赖 AbstractFoo 是 SELF 的子类型的事实.因此,例如,如果 AbstractFoo 具有返回 ..
发布时间:2021-05-10 18:51:39 Java开发

使用可变参数CRTP的智能指针工具包

我将要设计和实现一种智能指针工具包-一组用于定义各种类型的智能指针的类,例如unique_ptr,intrusive_ptr,shared_ptr,observing_ptr,tagd_ptr等.我没有可用的c ++库.我的想法是避免代码重复,使其遵循优雅的设计原则.让我描述一下我的想法. 设计注意事项:我想使用可变的CRTP方法来混合所需的指针功能,特征.对于每个功能集,都应该有一个特征类 ..
发布时间:2021-04-20 19:06:51 C/C++开发

使用CRTP,派生“使用".在C ++ 20中

我正在努力使自己了解CRTP和C ++ 20.基本上,我想拥有静态继承,可以使用来访问派生类型的 typedef s和: 模板类继承{上市:派生潜在的(){返回static_cast(* this);}派生常量底层的()常量{返回static_cast(* this);}};模板类测试器:公共继承{上市 ..
发布时间:2021-04-20 19:06:36 C/C++开发

策略类设计,但不将整个用户类作为模板

考虑以下代码,其中 Writer_I 充当接口.可以从中派生出满足正确形式的元素类型约定的其他类.在这里,选择printf和stream作为策略,选择 Calculator 作为用户. 该接口以某种方式存储在 Calculator 中,并且 write_i 隐藏了模板的所有丑陋细节,从而使类成员函数保持简洁.大多数事情在编译时仍然是已知的,并且可以内联. 我知道这是基于虚拟+派生多态性 ..
发布时间:2021-04-20 18:57:56 C/C++开发