[英]Double partial template specialization for a class
在學習c ++ 11/14時,我偶然發現了一些我正在做的代碼的小問題。 基本上,我有一個Debugging類,我想處理所有消息打印。 大多數調試/日志記錄類都有各種日志級別,但是我想對每個消息使用一個標志。
為此,我有一個小枚舉,可在其中定義我的標志及其值:
enum DebugFlag {
Flag1 = 0,
Flag2 = 1,
Flag3 = 2
};
另外,我有一個Debugging類,我設法專門用於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("Message\n"); // should not do anything with Flag1 compiled to 0 value
Debug<Flag2>::print("Message\n"); // should work
現在,我想擴展此類以也接受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
問題是我需要為Debug類提供第二個部分專業化功能,即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 good\n"; }
};
template <>
class Debug<bool, true> {
public:
void f() { std::cout<<"This is good too\n"; }
};
問題是您需要指定類型:是要使用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 bad\n"; }
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.