【<专题讨论>[模板模式]<1>】CRTP和mixin

xueweizhong 2003-09-23 12:02:07
加精
1: CRTP --- the CuriouslyRecurring Template Pattern
2: mixin -- 混合类

关于详细信息可在www.google.com上搜索。
mixin是OO设计模式,CRTP是C++ template technology

希望大家交流一下各自的见解和它们的用处。
...全文
342 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveCreatesBeauty 2003-11-25
  • 打赏
  • 举报
回复
学习
xueweizhong 2003-10-29
  • 打赏
  • 举报
回复
感谢各位兄弟支持。我这里结贴了。
我打算马上发第二贴,请大家继续支持。
Wolf0403 2003-10-20
  • 打赏
  • 举报
回复
STL 会导致相当严重的代码膨胀,所以代码缩减就是好的。
终于明白那个 object_counter 的秘密了。它没有调用 <T> 的构造函数,所以可以在 object_counter 和模板参数之间形成包含——继承的“循环”关系
gridcomputing 2003-10-19
  • 打赏
  • 举报
回复
mark
ttlb 2003-10-19
  • 打赏
  • 举报
回复
up
yjh1982 2003-10-13
  • 打赏
  • 举报
回复
除了"缩减代码量",好象好处不多.
代码少就好吗????????????????????????????????
iampolaris 2003-10-12
  • 打赏
  • 举报
回复
收藏 ing!!!!!!!!!!
Analyst 2003-10-12
  • 打赏
  • 举报
回复
CRTP在ATL/WTL里面被大量使用,可以用来解决很多问题。
不过这个东西不可以滥用,否则程序规模一大,会带来非常严重的编译依赖性,以致修改一个子类就可能导致重编译整个程序。个人觉得WTL里面的模板已经用的太多了。
yjh1982 2003-10-10
  • 打赏
  • 举报
回复
不好意思,又弄错了public 打成pubic
xueweizhong 2003-10-10
  • 打赏
  • 举报
回复
把你的代码完整的贴一下?
yjh1982 2003-10-10
  • 打赏
  • 举报
回复
各位牛人啊!
template<class Base>

class Printing : public Base

{...}
不能在DEV C++ 4.9.8.3通过!怎么会这样??????????????
mechgoukiteng 2003-09-27
  • 打赏
  • 举报
回复
cool不总是好处:)

以前看Modern C++ Design,认为自动产生模式的想法很cool

后来觉得aop也很cool-当然也有c++的实现

现在只觉得什么都要合适才好,还是去考虑包依赖关系去了
linghuye 2003-09-27
  • 打赏
  • 举报
回复
嘿嘿,挺有意思的.

我将CRTP视为编译期多态,语言本质上与执行期多态不同,但概念上相仿.
CRTP解决程序员在面临多个设计决策时的分派,多态解决程序在面临多个运行时类型的分派.

设计模式一书中,TemplateMethod采用多态实现,但若是设计时的决策问题,完全可用CRTP代替.如果使用组合代替继承,其又变成strategy模式了.模式不同,表达出来的概念重点不同.虽然设计模式一书推崇组合,但个人喜欢继承,比较简洁,比较酷.

xueweizhong的那个A<B<A> >做法有点酷,连Modern C++ Design都没提过,有意思,研究一下有什么模式可套用.
xueweizhong 2003-09-23
  • 打赏
  • 举报
回复
to plainsong:
第二次回答:
>组合代替继承是完全可行的,一般我都会把多重继承关系中的一些继承关系改为组合关系。

1:我同意你的观点。
2:但我更偏向于使用继承,因为
template<typename T> struct base<T> (in our case base = A)
显然是提供了一个泛型接口。


xueweizhong 2003-09-23
  • 打赏
  • 举报
回复
>to plainsong

先回答你第一个:
A<B<A> > is OK, see following:


template <template <class> class T>
struct B
{
};

template <class T>
struct A
{
};

int main()
{
A<B<A> > a;
// --> A is a template (suppose with type-tempalte-argument)
// --> type-agument is B<A>
// --> B is a template with template-template-arugment A!!!
}
sevecol 2003-09-23
  • 打赏
  • 举报
回复
使基类参数化,能为不同的类型服务

像<<C++ Templates: The Complete Guide>>
中的计数器例子
短歌如风 2003-09-23
  • 打赏
  • 举报
回复
还有一点你没有考虑到:
class B: public A<B>;

B的基类与B本身就是相关的,不同的衍生类的基类也不同。所以用A<B>作为参数本身恐怕就没有意义,完全可以用B作为参数。
短歌如风 2003-09-23
  • 打赏
  • 举报
回复

不会存在A<B<A> >的,只会有A<B<A<C> > >或A<B<A<> > >等。

关于foo的调用,把B中的const A<B> a的const去掉就行了:
foo(b.a);

组合代替继承是完全可行的,一般我都会把多重继承关系中的一些继承关系改为组合关系。
xueweizhong 2003-09-23
  • 打赏
  • 举报
回复
to plainsong:

你枚举了两种方式,

1:在第一种包含情形下:
B -->(includes) A
将导致这个函数不能使用:
template <typename T>
void foo(A<T>&);

2:在继承情况下:
A<B>
|
|
B

template <typename T>
void foo(A<T>&);
这个接口函数是可以使用的:
B b;
foo(b);
这个函数模板参数的推导用了STD98中关于《函数调用情形下模板参数推导》
例外情况下的最后一种:
"if P is a template-id ( 这里是A<T>),
A could be derived class of P."
xueweizhong 2003-09-23
  • 打赏
  • 举报
回复
发现一个有意思的问题:

为什么有
A<B<A> > #legal if A, B is properly defined
而不能有:
A<A> #illegal for any A

而A<B<A> >就是我们的CRTP的一种:
A is curiously recursively determined by A
加载更多回复(15)

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧