问题标签 [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.
c# - 自反类型参数约束:X其中 T : X‒ 有更简单的替代方案吗?
每隔一段时间,我就会通过向其添加自引用(“自反”)类型参数约束来使简单接口变得更加复杂。例如,我可能会这样:
进入:
主要优点:实现类型(例如Sheep
)现在可以引用自身而不是其基类型,从而减少了类型转换的需要(如最后一行代码所示)。
虽然这非常好,但我也注意到这些类型参数约束不直观,并且在更复杂的场景中变得非常难以理解。*)
问题:有谁知道另一种 C# 代码模式可以实现相同的效果或类似的东西,但以更容易掌握的方式?
*)此 Code Pattern 可能不直观且难以理解,例如:
该声明
X<T> where T : X<T>
似乎是递归的,有人可能想知道为什么编译器不会陷入无限循环,推理,“如果T
是一个X<T>
,那么X<T>
真的是一个X<X<…<T>…>>
。” (但约束显然不会像那样得到解决。)对于实现者来说,应该指定什么类型来代替
TImpl
. (约束最终会解决这个问题。)一旦您在混合中添加更多类型参数和各种通用接口之间的子类型关系,事情就会很快变得难以管理。
c++ - Templatized derived class inheriting through CRTP class, access to base class member object
If I try to call a member function of a member of the base class from a template class on the other end of the inheritance hierarchy,
I get this error message:
though bar
is obviously a member of a member of basis
, not of basis
itself.
This does not happen with non-template final classes (of which a number are already in use, all deriving through the crtp
intermediate class; so I wouldn't want to change anything about that), nor with a template class that directly derives from basis
.
What's wrong here?
c++ - 问题重构奇怪地重复出现的模板模式
以下代码无法在 g++ 4.6.1 上编译:
有错误
将 static_cast 更改为 reinterpret_cast 将使代码编译,并且在这种情况下可以工作,但我想知道这是否在所有情况下都是可接受的解决方案?即,是否存在指向基类的指针与此不同的情况?我假设如果父母有数据成员,这可能会发生多重继承?如果 GetBase 是第一个超类,是否保证 this 指针相等?
c++ - 使用继承时,带有 CRTP 的 typedef 不起作用
有没有办法通过CTRP为继承关系中的类定义同名类型?我尝试了以下代码,error: member 'ptr_t' found in multiple base classes of different types
但从clang++
.
当然,下面的也可以(不过是多余的,违背了DRY原则)。
如果没有办法通过使用 CRTP 来实现这种行为,那为什么会被禁止呢?
c++ - 返回对 this 和继承的引用
对于某些语法糖,我想返回对 的引用this
,但是在继承时,该函数应返回子类的类型:
由于操作员,我不能只返回指针和 dynamic_cast 它,它必须是一个引用。
这甚至可能吗?使用decltype(*this)
for T 不起作用,也不起作用auto f()->decltype(*this)
,因为this
(虽然我不明白为什么,在自动情况下)
在 Scala 中,您可以编写如下内容:
但是我的 g++ 不会接受这个(不确定这是错误还是不在规范中?)
当然有明确的方式,但我想知道是否可以使用 C++11 特性来避免这种情况?
c++ - 您可以使用 CRTP 和以接口为参数的函数吗?
在 C++ 中,纯虚拟类通常用于运行时多态性。
所以你有了:
和派生类,如:
然后可以在以下功能中使用:
但这是运行时情况,如果在编译时知道对象,我们可以使用 CRTP 做得更好:
是否可以在将 IInterface 作为参数的函数中使用基于 CRTP 的派生类?
c# - C# - 侵入式树结构,使用 CRTP
我目前正在研究一种在 C# 中实现侵入式树结构的简单方法。由于我主要是 C++ 程序员,所以我立即想使用 CRTP。这是我的代码:
这可行但是...我不明白为什么在调用 a_node.SetParent((T)this) 时必须进行转换,因为我使用的是泛型类型限制... C# cast 有成本,我想不要在每个侵入式集合实现中传播这种演员......
c++ - 仅删除最后一个引用,CRTP
我正在使用模拟框架。生成的每个粒子都有一个指向 UserInfo 对象的指针槽(因此您可以将所需的任何信息附加到粒子)。问题在于,每当粒子被杀死时,框架都会删除此用户信息。由于有数以百万计的粒子,通常具有重复的信息,我只想在信息不同时创建一个新的 UserInfo 对象。当然,问题是每当一个粒子被杀死时,它都会删除它有一个指针指向的 UserInfo 对象(不管同一个对象是否也附加到某个其他粒子。)
当粒子被杀死时,我需要采取哪些步骤来防止粒子删除 UserInfo 对象?我意识到我需要为我的 UserInfo 类做一些引用计数和重载删除。但是,我以前从未重载过 delete,所以我有几个问题:
如果我有一个类层次结构,例如:
我在A类中重载delete,如果在指向VirtualUserInfo的指针或指向B类的指针上调用delete,它会起作用吗?(非常相似,如何重载 new 才能正常工作?是否需要为每个新的派生类再次重载 new ?)
使用奇怪重复的模板模式很容易进行引用计数。有没有办法以这种混合风格的方式也包括删除行为?将这种类型的行为应用于我要编写的任何类型的 UserInfo 会很好。
有没有一些更酷/更好的方法来做我想做的事情?
c++ - 奇怪重复的模板模式多态副本中的继承 (C++)
我正在使用 CRTP 向继承的类添加克隆方法,例如:
但是如果我有一个继承自 B 的类,例如:
那么clone()没有返回一个不同类型的对象,它返回一个B。除了在不同的B中写一个新的clone()方法,有没有办法解决这个问题?
谢谢阅读!
c++ - 使用 CRTP 的转发构造函数
我正在使用带有 CRTP 的模板类来实现克隆模式,并使用第二个模板参数 Base 来允许多级继承。当我尝试调用间接基类的构造函数时出现编译器错误。
到目前为止,我遇到的唯一解决方案是在 Cloneable 中使用可变参数模板构造函数,但我的编译器 (VC++11) 尚未实现它们。