c++ - 一个类的双重部分模板特化

标签 c++ templates metaprogramming partial specialization

我在学习 c++11/14 时偶然发现了一些代码的小问题。基本上我有一个调试类,我想处理所有的消息打印。大多数调试/日志记录类都有各种日志级别,但我想为我拥有的每条 消息使用一个标志。

为此,我有一个小枚举,用于定义我的标志及其值:

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,我无法弄清楚它的语法是什么。 这是我最接近它的一次,但仍然无法弄清楚我做错了什么,或者是否有可能不进行中学类(class)并改变我希望我的电话看起来像的方式: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"; }
};

Live example

关于c++ - 一个类的双重部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39084953/

相关文章:

c++ - 将约束应用于模板的三种方式有什么区别?

c++ - std::tr1::shared_ptr 是否会抛出 bad_alloc 并且在 try/catch block 中是个好主意?

c++ - 模板元编程 : "does not have integral or enumeration type"

c++ - 通过某种形式的反射对 C++ 中的 C 数据结构进行通用访问?

c# - 我想要一种用于元编程的预处理语言

c++ - 使用 std::enable_if 作为函数参数与模板参数有什么区别?

c++ - 避免 GUI 在多线程操作时卡住

c++ - 多态性 - 不确定使用模板的派生类 - 派生函数返回模板类型

r - 查找包含 R 函数定义的源文件

c++ - lambda 中的 noexcept 在 vs2012 中如何工作?