class 的双重部分模板特化
Double partial template specialization for a class
我在学习 c++11/14 时偶然发现了一些代码的小问题。基本上我有一个 Debugging class,我想处理所有的消息打印。大多数 debugging/logging classes 都有各种日志级别,但我想为我拥有的 each 消息使用一个标志。
为此,我有一个小枚举,用于定义我的标志及其值:
enum DebugFlag {
Flag1 = 0,
Flag2 = 1,
Flag3 = 2
};
另外,我有一个调试 class,我已经设法专门针对 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";
}
};
要调用此 class,我使用如下调用:
Debug<Flag1>::print("Message\n"); // should not do anything with Flag1 compiled to 0 value
Debug<Flag2>::print("Message\n"); // should work
现在我想扩展此 class 以也采用 bool
值,因此这样的调用将起作用:
Debug< Flag2<2 >::print("Message\n"); // should not do anything with Flag1 compiled to 2 value
Debug< Flag2<1 >::print("Message\n"); // should work
问题是我的调试 class 需要第二个部分特化,即 bool
,我无法弄清楚它的语法是什么。
这是我最接近它的一次,但仍然无法弄清楚我做错了什么,或者是否有可能不进行辅助 class 并改变我希望我的电话看起来像的方式:http://cpp.sh/6yemn
我不明白你想如何使用你的class,但这里有一些有用的东西。
template <typename T, T v = T()>
class Debug {};
template <>
class Debug<Flag, Flag2> {
public:
void f() { std::cout<<"This is good\n"; }
};
template <>
class Debug<bool, true> {
public:
void f() { std::cout<<"This is good too\n"; }
};
问题是您需要指定类型:是要使用 bool
还是 Flag
,然后是值。您可以像这样实例化 class :
Debug<bool, true> trueDebug;
Debug<Flag, Flag2> flag2Debug;
其他实例将没有 f
功能,除非您添加专业化。例如:
template <Flag v>
class Debug<Flag, v> {
public:
void f() { std::cout<<"This is bad\n"; }
};
我在学习 c++11/14 时偶然发现了一些代码的小问题。基本上我有一个 Debugging class,我想处理所有的消息打印。大多数 debugging/logging classes 都有各种日志级别,但我想为我拥有的 each 消息使用一个标志。
为此,我有一个小枚举,用于定义我的标志及其值:
enum DebugFlag {
Flag1 = 0,
Flag2 = 1,
Flag3 = 2
};
另外,我有一个调试 class,我已经设法专门针对 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";
}
};
要调用此 class,我使用如下调用:
Debug<Flag1>::print("Message\n"); // should not do anything with Flag1 compiled to 0 value
Debug<Flag2>::print("Message\n"); // should work
现在我想扩展此 class 以也采用 bool
值,因此这样的调用将起作用:
Debug< Flag2<2 >::print("Message\n"); // should not do anything with Flag1 compiled to 2 value
Debug< Flag2<1 >::print("Message\n"); // should work
问题是我的调试 class 需要第二个部分特化,即 bool
,我无法弄清楚它的语法是什么。
这是我最接近它的一次,但仍然无法弄清楚我做错了什么,或者是否有可能不进行辅助 class 并改变我希望我的电话看起来像的方式:http://cpp.sh/6yemn
我不明白你想如何使用你的class,但这里有一些有用的东西。
template <typename T, T v = T()>
class Debug {};
template <>
class Debug<Flag, Flag2> {
public:
void f() { std::cout<<"This is good\n"; }
};
template <>
class Debug<bool, true> {
public:
void f() { std::cout<<"This is good too\n"; }
};
问题是您需要指定类型:是要使用 bool
还是 Flag
,然后是值。您可以像这样实例化 class :
Debug<bool, true> trueDebug;
Debug<Flag, Flag2> flag2Debug;
其他实例将没有 f
功能,除非您添加专业化。例如:
template <Flag v>
class Debug<Flag, v> {
public:
void f() { std::cout<<"This is bad\n"; }
};