草庐IT

Shape_CRTP

全部标签

android - Nine-Patch Drawable 与 Shape Drawable。应该首选哪个?

我和我的同事并行开发了两个应用程序,每个应用程序都具有相似的样式。这些应用程序的主视图背景是径向渐变。他将他的实现为一个九补丁图像,我用一个可绘制的形状来实现。两者都产生相似且可接受的结果。所以我的问题是,我们应该使用哪个?内存消耗和性能之间是否存在权衡?我想图像可能需要一些时间来加载,但可绘制的形状需要更多时间来绘制(由于计算)。然后将这些存储在缓存中并且这些惩罚仅在它们第一次显示时发生,或者这些问题是否持续存在???可绘制形状:9-patch: 最佳答案 Shapedrawable非常适合具有简单恒定颜色变化的渐变图像。另一方面

c++ - 使用 CRTP 时如何获取模板参数的大小?

在VC++10中,以下示例失败并出现错误C2027:“使用未定义的类型‘X’”。然而g++4.6编译它就好了。templateclassC{staticconstsize_tsize=sizeof(T);};classX:publicC{};那么哪个是对的呢?我该怎么做才能让它在主流编译器上运行?不过这没什么大不了的,因为VC++仍然允许在C的成员函数中使用sizeof(T)。我只需要重复一些很烦人的长类型定义。编辑:我意识到我的示例很糟糕,因为我真正想做的是使用大小作为编译时间常量,以这种方式:templateclassC2{};templateclassC{typedefC2A;}

c++ - 使用带接口(interface)的 CRTP

我有一组实现相同业务方法的类。由于性能原因,我打算使用CRTP而不是虚拟调度。但我想保持编码的便利性,将其编码到带有继承和虚拟方法的单个接口(interface)。是否可以让我的专用类继承自使用CRTP保存公共(public)代码的模板化抽象类,以及继承自纯虚拟类,这样我就可以创建每种类型的实例,但让我的客户端代码依赖只在界面上?更好的是,我如何使用CRTP为客户端代码提供单一接口(interface),同时具有多个实现? 最佳答案 当然。您可以使用这样的方法,这是完全有效的:classInterface{public:virtua

c++ - CRTP:为什么获取派生类的嵌套类型和嵌套方法之间存在差异?

CRTP模式中的基类可以访问派生类的成员函数,但不能访问派生类中的嵌套类型。为什么会有这种差异?为了说明,请考虑以下代码:templatestructcrtp_base{voidcrtp_method(){returnstatic_cast(*this).method();}//compilesusingcrtp_type=typenameDerived::type;//doesn'tcompile};structX:publiccrtp_base{voidmethod(){}usingtype=int;};intmain(){}crtp_type导致编译错误,而crtp_method

c++ - CRTP和template模板参数限制

我正在尝试使用CRTP,但我对以下代码无法编译的原因感到困惑。templateclassCBase>structComponentX:publicCBase{//ThisdoesNOTcompile};templateclassCBase>structComponentY:publicCBase{//Thisdoescompile};你知道在CRTP的情况下模板模板参数是否有一些限制吗? 最佳答案 类模板名称代表“当前特化”(即它是一个注入(inject)的类名)仅在打开{之后类模板定义,在其范围内。在此之前,它是一个模板名称。所以

c++ - 静态多态的Strategy和CRTP有什么区别?

我想要一个具有多种可能实现的接口(interface),在编译时选择。我看到CRTP是实现它的首选习惯用法。这是为什么?另一种方法是策略模式,但我在任何地方都看不到这种技术的提及:templateclassStrategyInterface{public:voidInterface(){impl.Implementation();}voidBrokenInterface(){impl.BrokenImplementation();}private:Implimpl;};classStrategyImplementation{public:voidImplementation(){}};

c++ - 是否可以使用 CRTP 模拟静态多态性中的纯虚函数?

我正在尝试使用CRTP实现编译时多态性,并希望强制派生类实现该功能。目前的实现是这样的。templatestructbase{voidf(){static_cast(this)->f();}};structderived:base{voidf(){...}};在此实现中,如果派生类未实现f(),则对该函数的调用将陷入无限循环。如何强制派生类像纯虚函数一样实现函数?我尝试使用像static_assert(&base::f!=&Derived::f,"...")这样的“static_assert”,但它生成一条错误消息,指出两个成员函数指针指向不同的类的成员函数没有可比性。

c++ - constexpr 和 CRTP : compiler disagreement

当使用CRTP实现表达式模板时,位于表达式层次结构顶部的类使用基到派生的向下转型来实现它的一些操作。根据clang-3.5(-std=c++1y),这种向下转换在constexpr函数中应该是非法的:test.cpp:42:16:error:static_assertexpressionisnotanintegralconstantexpressionstatic_assert(e()==0,"");^~~~~~~~test.cpp:11:26:note:cannotcastobjectofdynamictype'constbase'totype'constderived'constn

C++ -& CRTP 。类型删除与多态性

好的,我们开始吧。我正在尝试使用CRTP模板,以便从我的应用程序中删除多态性的需要。我使用像下面这样的方法templateclassBase{voiddoSomething(){static_cast(this)->doSomethingImpl()}classDerived1:publicBase{voiddoSomethingImpl(){/*dosomething,forreal*/}}classDerived2:publicBase{voiddoSomethingImpl(){/*dosomethingelse*/}}如果我理解正确的话,这种方法允许我的类没有vtable,所以

c++ - 在 C++ 中将基于策略的设计与 CRTP 混合

我正在尝试编写一个基于策略的主机类(即,一个继承自其模板类的类),其中策略类也由主机类模板化,以便它可以访问其类型。这可能有用的一个示例是策略(实际上像混合一样使用)使用多态clone()方法扩充主机类。这是我正在尝试做的一个最小示例:templateclassP>structHost:publicP>{typedefP>Base;typedefHost*HostPtr;Host(constBase&p):Base(p){}};templatestructPolicy{typedeftypenameH::HostPtrHptr;Hptrclone()const{returnHptr(n