首页 > 解决方案 > 使用模板特化写入两个输出流

问题描述

我正在尝试创建一个日志库,用户可以在其中选择写入输出或文件或两者兼而有之。我想创建一个单独的类来处理写入(以及稍后处理其他与流相关的东西)。

显而易见的实现是对所有功能使用 if 语句,但我想使用模板专业化对其进行优化。我创建了一个名为DoubleStreamWriter

template <typename _FST, typename _OST>
class DoubleStreamWriter {
public:
    DoubleStreamWriter(_FST fst, _OST ost) {
        fst_ = fst;
        ost_ = ost;
    }
    template <typename WT>
    void Write(WT obj) {
        (*fst_) << obj;
        (*ost_) << obj;
    }
    void Flush() {
        fst_->flush();
        ost_->flush();
    }

private:
    _FST fst_;
    _OST ost_;
};

template <>
class DoubleStreamWriter <std::nullptr_t, std::ostream*> {
public:
    DoubleStreamWriter(std::nullptr_t fst, std::ostream* ost) {
        (void)fst;
        ost_ = ost;
    }
    template <typename WT>
    void Write(WT obj) {
        (*ost_) << obj;
    }
    void Flush() {
        ost_->flush();
    }

private:
    std::ostream* ost_;
};

template <>
class DoubleStreamWriter <std::ofstream*, std::nullptr_t> {
public:
    DoubleStreamWriter(std::ofstream* fst, std::nullptr_t ost) {
        (void)ost;
        fst_ = fst;
    }
    template <typename WT>
    void Write(WT obj) {
        (*fst_) << obj;
    }
    void Flush() {
        fst_->flush();  
    }

private:
    static std::ofstream* fst_;
};

template <>
class DoubleStreamWriter <std::nullptr_t, std::nullptr_t> {
public:
    DoubleStreamWriter(std::nullptr_t fst, std::nullptr_t ost) {
        (void)fst;
        (void)ost;
        std::cout << ">>> cannot log anything with those settings" << std::endl;
    }
    template <typename WT>
    void Write(WT obj) {
        (void)obj;
    }
    void Flush() {

    }
};

logger 类是一个单例,它有一个dwriter_这种类型的私有指针 ( )。但是,我显然无法在初始化期间更改模板的类型,例如无法转换DoubleStreamWriter<ofstream*, ostream*>DoubleStreamWriter <std::nullptr_t, ostream*>. 我试图通过使用 a 来“修复”它,void*但这只是将问题推迟到运行时并且非常难看。

我的错误是我认为decltype(stream_ptr)如果std::nullptr_t设置stream_ptrnullptr.

这样做的最佳方法是什么?decltype(nullptr)或者,有没有办法获得与调用decltype设置为 的指针时相同的类型nullptr

标签: c++templatesstatic-castnullptr

解决方案


推荐阅读