【发布时间】:2016-08-05 13:20:10
【问题描述】:
我写了一个非常简单的日志类。
日志记录类有一个如下所示的函数:
template <typename T, typename... Args>
void log (T && first, Args &&... rest) {
log (std::forward <T> (first));
log (std::forward <Args> (rest)...);
}
template <typename T>
void log (T && last) {
/* use <sstream>'s std::ostringstream to convert each T to its string
representation, then print it via a callback. */
}
由于我的日志记录类可能会在我的程序中经常使用,因此我正在尝试减少由于#includ-ing 我的记录器文件而附加到每个翻译单元上的代码量。
我已经设法将除 <string> 之外的所有 #include 语句从头文件中移出并移到实现文件中,除了整个 <sstream> 及其所有依赖项,其中是实现此模板成员函数所必需的。
我考虑过显式实例化我需要的所有重载,但如果我希望将我的记录器与字符串文字一起使用,那么我认为我必须为const char (&) [n] 中的每个n 显式实例化一个模板。或#include <type_traits> 为std::decay。 :(
是否可以避免将<sstream> 拖到所有使用我的记录器的 TU 中?怎么样?
【问题讨论】:
-
你有没有想过使用
std::to_string()(C++11)?看看这是否有助于删除<sstream>。对于其他类,您可以实现特定于类的public方法to_string()。 -
也许PIMPL idiom 可能是相关的
-
@iammilind 嗯。我可以自己进行转换(使用
to_string()等等)。我真的不需要<sstream>来做到这一点。对于其他任何事情,“to_string”(非?)成员函数是完全可以接受的。 -
如果你的
log函数所做的只是包装一个流,你为什么不直接实现operator<<? -
@uhohsomebodyneedsapupper 没有理由不这样做。坦率地说,我发现函数调用语法更好,我将主要通过宏使用它(用于行号、文件等)。
标签: c++ dependencies header-files