类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
我发现Loki库中的typelist的用处不是很大,每次要使用的华 typedef TYPELIST_5< int,usigned long,char,byte, short> FIVETYPELIST;
他提供的list_remove, list_add,都不是封装好的,而且访问都要提供数字,不知道各位大侠有什么办法能根据一个typelist 自动创建typelist内的类型实例。而且其他人不要关心typelist的技术细节,只要重新list_add增加一个新类型,其代码不需修改,就能创建这个新类型和以前类型的实例。
网友回答:
我感觉这个东西用处不到;至少我工作中根本没有用到过;以前在学校的时候到是看过;现在都忘了
typelist只是一种技术,有什么用全看你自己.我的程序中就有很多这种东西.不过和书上说的那种用法完全不一样.也没人愿意看!这才是郁闷的地方....
还有,C++中类型是没法修改的,所以,所有的add,remove之类的操作都不过是产生一个新类型.要完全不修改其它的代码是不可能的,至少有一处要改一下类型的名字.
至于你说的功能看上去有点像类工厂,这个很好实现,只要给你的模板加个产生类实例的函数就可以了.其实书上的typelist功能并不是很强,你还可以给它加名称/类型访问的机制,还可以做成动态访问的....
不知道你说的不方便是指什么.我所说的加个Builder函数就是加在typelist中的.你说的功能实现起来大致如下:
#include <stdio.h>
#include <string.h>
typedef struct _NULL_TYPE NullType;
template < typename _classname, typename _nextnode = NullType >
class ClassList {
public:
typedef _classname Type;
typedef _nextnode NextNode;
static void *CreateObj( void ) {
return new Type;
}
static void *CreateByName( const char *pName ) {
if ( strcmp(Type::GetName(), pName) == 0 ) {
return CreateObj();
} else {
return NextNode::CreateByName( pName );
}
}
};
template< typename _classname >
class ClassList< _classname, NullType > {
public:
typedef _classname Type;
static void *CreateObj( void ) {
return new Type;
}
static void *CreateByName( const char *pName ) {
if ( strcmp(Type::GetName(), pName) == 0 ) {
return CreateObj();
} else {
return NULL;
}
}
};
class Type1{
public:
static const char *GetName( void ) {
return "Type1";
}
Type1() {
printf("Create Type1!\n");
}
};
class Type2{
public:
static const char *GetName( void ) {
return "Type2";
}
Type2() {
printf("Create Type2!\n");
}
};
typedef ClassList< Type1, ClassList< Type2> > classlist;
int main(void) {
classlist::CreateByName( "Type2" );
classlist::CreateByName( "Type1" );
....
return 0;
}