c++ - 使用模板特化写入两个输出流
问题描述
我正在尝试创建一个日志库,用户可以在其中选择写入输出或文件或两者兼而有之。我想创建一个单独的类来处理写入(以及稍后处理其他与流相关的东西)。
显而易见的实现是对所有功能使用 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_ptr
为nullptr
.
这样做的最佳方法是什么?decltype(nullptr)
或者,有没有办法获得与调用decltype
设置为 的指针时相同的类型nullptr
?
解决方案
推荐阅读
- bash - 如何正确比较 Bash 中的变量和字符串?
- c - 套接字如何在C中接受多个连接
- sql-server - Docker 网络中的 SQL Server:在 $PATH 中找不到可执行文件“:未知
- docker - Docker COPY 失败,没有这样的文件或目录
- javascript - 如何为表单Javascript中的选择分配数值
- sql - 如何在 ASP.NET MVC5 中为特定模式执行自动增量
- batch-file - 如何使批处理文件对特定输入做出不同的回答?
- php - 关于准备好的语句和连接的建议
- javascript - Express 标头没有 cookie,具体取决于路径
- css - Oxygen XML 作者中的 XPath 和 CSS:如何在 oxy_xpath 中创建动态参数