簡體   English   中英

一類的雙部分模板專門化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM