如何实现这样的模版类?

Smile_Tiger 2006-10-24 04:25:33
template<bool bEnableLog>
class A
{
func()
{
1.这里是func的实现代码;

2.如果bEnableLog为true,那么这里是输出日志的代码,否则这里没有任何代码
}
}


当然可以用特化来实现

template<bool bEnableLog> class A;

template< true >
class A
{
func()
{
1.这里是func的实现代码;
2.这里是输出日志的代码
}
};

template< false >
class A
{
func()
{
1.这里是func的实现代码;
2.这里没有任何代码
}
};



但是特化造成的问题是,func的实现代码写了两遍,我不想这样,该如何实现?
...全文
267 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
a_b_c_abc9 2006-10-28
template<>
void A<int,false>::log() // 全特化就正确了
{ ;
}
回复
qingcairousi 2006-10-28
郁闷的就是函数不能偏特化,包括成员函数……
普通函数不能偏特化理解,但是成员函数不能就太不爽了……
没办法,只能copy代码……
或者把log独立出来:
template<typename _T,bool bEnableLog>
struct Logger{
public:
static void log(){
//.....
}
}
template<typename _T>
struct Logger<_T,false>{
public:
static void log(){

}
}

然后template<typename _T,bool bEnableLog> struct A
{
//.....
friend Logger<_T,bEnableLog>;
void func(){
Logger<_T,bEnableLog>::log();
}

}
回复
Smile_Tiger 2006-10-25
to qingcairousi(青耕) :

问题升级,现在多加了个typename _T

template<typename _T,bool bEnableLog> struct A
{
void func()
{
_T temp;

//...........
log();
}

void log();
};

template<typename _T,bool bEnableLog> void A<_T,bEnableLog>::log()
{
cout<<"log.........."<<endl;
};

template<> void A<false>::log() // ----------------compile error
{
};

那个地方怎么写都不正确,不知道该怎么写
回复
qingcairousi(青耕)
正解
回复
a_b_c_abc9 2006-10-24
楼上,人家的目的是编译期判断bEnableLog,你跑到运行时去判断干嘛……
=================================

哦,刚学模板,看来观念还没有转过来。谢谢啊
回复
qingcairousi 2006-10-24
template<bool bEnableLog> struct A
{
void func()
{
//...........
log();
}
void log();
}

template<bool bEnableLog> void A<bEnableLog>::log()
{
cout<<"log.........."<<endl;
}

template<> void A<false>::log()
{
}
回复
qingcairousi 2006-10-24
楼上,人家的目的是编译期判断bEnableLog,你跑到运行时去判断干嘛……
回复
a_b_c_abc9 2006-10-24
这样好象就可以了,不用特化。
template<bool bEnableLog>
class A
{
public:
void func()
{
if(bEnableLog)
cout<<"fun(日志)"<<endl;
else
cout<<"(没有日志)"<<endl;
//1.这里是func的实现代码;
// 2.如果bEnableLog为true,
//那么这里是输出日志的代码,否则这里没有任何代码
}
};

void main()
{
A<true> a;
A<false> b;
a.func();
b.func();
}
回复
Kusk 2006-10-24
把实现代码独立出来成为一个函数,由两个func分别调用即可。可以考虑inline修饰。
回复
发动态
发帖子
模式及实现
创建于2007-09-28

5523

社区成员

C/C++ 模式及实现
申请成为版主
社区公告
暂无公告