如何实现这样的模版类?

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的实现代码写了两遍,我不想这样,该如何实现?
...全文
326 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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修饰。
打开链接下载源码: https://pan.quark.cn/s/8ec3d104bde6 华为MA5671是一款针对宽带接入需求而研发的智能型光猫设备,其核心应用场景为家庭用户及小型企业环境。该设备运用了千兆以太网技术,能够提供卓越的网络连接性能,从而使用户可以体验到稳定流畅的互联网服务。其完整名称为SmartAX MA5671,其中"SmartAX"是华为对其智能接入产品系列的特定命名,意指该设备具备智能化管理功能与自动化配置特性。固件,即Firmware,是指存储于硬件设备内部的一套程序代码,负责控制设备的各项功能运作并合理调配硬件资源。在华为MA5671设备中,固件发挥着核心作用,它直接影响着设备的操作系统运行机制、网络协议兼容性、安全防护机制以及性能表现等多个维度。"MA5671V8R313C00SPC100"作为该固件的标识编号,通过此代码可以解析出以下几个关键层面的信息: 1. **V8**:这通常象征固件的主版本号,或许表明这是第8代产品形态或第8次主要升级迭代。 2. **R313**:这可能代表固件的次级版本或修订层级,暗示着相较于V8版本,该版本经历了313次的迭代优化。 3. **C00**:这部分或许与设备的特定型号设定或地域适配性相关,不同的C00编码可能对应不同的功能模块配置或区域适应性调整。 4. **SPC100**:最后的这一段编码可能标识着特殊版本或性能增强配置,SPC(Special Performance Configuration)可能是华为针对特定性能优化版本设定的代号,而100可能代表这种优化措施的等级或序列编号。 在实际部署过程中,将固件保持为最新版本是非常重要的,这样做能够有效修正已知的安全隐患,优化设备运作效能,...

5,529

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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