关于模板的用法
需求如下:
有很多种类型的log, 每种类型的log内部结构完全不一样,但需要统一管理
我的实现如下:
enum LogType
{
eLT_Open,
eLT_Close,
eLT_Count,
eLT_Force32Bite = 0xFFFFFFFF
}
struct LogBase{...}
template<>
struct Log<eLT_Open> : Logbase
{
int a;
}
template<>
struct Log<eLT_Close> : Logbase
{
string b;
}
如上,这样可以通过一个宏 #define CREAT_LOG(LogType, ...) new Log<LogType>(__VA_ARGS__)
轻松创建一个类型的LOG.
他人的意见如下: 用模板的意义在于出现未定义的类型时,编译器帮我们自动处理
该处实际上会实例化所有的类型,不存在对默认类型的处理,所以该处不应该用模板类
所以应该改为
#define CREAT_LOG(LogType, ...) new Log##LogType(__VA_ARGS__)
struct LogBase{...}
struct LogeLT_Open : Logbase //可能会对这个名字进行处理去掉枚举前缀,暂且不讨论这个问题.
{
int a;
}
struct LogeLT_Close : Logbase
{
string b;
}
大家怎么看.真的不能在这个地方用模板类吗?
[解决办法]
C++是建议用模板来取代宏,你倒好,又倒回去了。
[解决办法]
兄弟,我用的是第一种。
但是我 并没有用 你那个 CREAT_LOG 宏,
因为如果要 像你那样做的话 ,你就必须在每新增一个 Log 类 的 同时 去 维护 LogType 枚举
这完全没有必要,原因是:模板特化 是 在 编译时期 绑定的,你的 LogType 并不能在 运行时期 起到 选择 的作用。反而多增加了一个 LogType 枚举,而且必须要去维护使其与真实的 Log类族 保持一致,多么麻烦!!
而我个人不用第二种方法的主要原因是 它使得 我产生了许多 Log... 类,不便于管理,而且 类多了 之后还容易跟 其他类 混淆,但如果是 诸如 Log<xx> 之类的类名,一看就知道是 对 派生类的特化,就不容易与其他类混淆。 而且还可以借助编译器的功能,按'Log<'后,自动列出可以选择的特化类,非常方便。
而且添加和删除都不用维护一个枚举类了。