类的双部分模板特化
Double partial template specialization for a class
本文关键字:双部 更新时间:2023-10-16
我在学习c++11/14时偶然发现了一个小问题。基本上,我有一个调试类,我想处理所有的消息打印。大多数调试/日志记录类都有不同的日志级别,但是我想为我拥有的每个消息使用一个标志。
我有一个小枚举,我在这里定义了我的标志和它们的值:
enum DebugFlag {
Flag1 = 0,
Flag2 = 1,
Flag3 = 2
};
另外,我有一个调试类,我已经设法为Flag类型专门化,它工作得很好。
template<DebugFlag T>
class Debug {
public:
template <typename U>
static void print(U &&arg) {}
};
template <>
class Debug<static_cast<DebugFlag>(1)> {
public:
static void print(std::string &&message) {
std::cerr<<message<<"n";
}
static void print(std::ostream &message) {
std::cerr<<DebugStream()().str()<<"n";
DebugStream()().str("");
DebugStream()().clear();
}
static void print(std::string &message) {
std::cerr<<message<<"n";
}
};
要调用这个类,我使用如下调用:
Debug<Flag1>::print("Messagen"); // should not do anything with Flag1 compiled to 0 value
Debug<Flag2>::print("Messagen"); // should work
现在我想将这个类扩展为也接受bool
值,所以这样的调用将工作:
Debug< Flag2<2 >::print("Messagen"); // should not do anything with Flag1 compiled to 2 value
Debug< Flag2<1 >::print("Messagen"); // should work
问题是我需要第二个部分专门化为我的调试类,即bool
,我不能确切地指出这是什么语法。这是我最接近它,但仍然不能弄清楚我做错了什么,或者如果不做二级类并改变我希望我的调用看起来像:http://cpp.sh/6yemn
我不太明白你想如何使用你的类,但这里有一些工作。
template <typename T, T v = T()>
class Debug {};
template <>
class Debug<Flag, Flag2> {
public:
void f() { std::cout<<"This is goodn"; }
};
template <>
class Debug<bool, true> {
public:
void f() { std::cout<<"This is good toon"; }
};
问题是您需要指定类型:是要使用bool
还是Flag
,然后是值。您可以像这样实例化这个类:
Debug<bool, true> trueDebug;
Debug<Flag, Flag2> flag2Debug;
除非您添加专门化,否则其他实例不会具有f
函数。例如:
template <Flag v>
class Debug<Flag, v> {
public:
void f() { std::cout<<"This is badn"; }
};
生活例子
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- C++我需要了解在哪里使用指针和双指针
- C++中的双指针类型转换
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 我想知道长双倍和双倍之间的区别
- 多线程双缓冲区
- C++,指针数组,指向双链表中的条目
- 如果基类包含双指针成员,则派生类的构造函数
- 结构和双指针隐藏在其他结构中,多层混淆
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- 如何使用原子指针执行双缓冲
- 如何将部分流作为参数传递
- C++长双大"safe"整数
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了