我尝试创建一个具有修改格式的
std::print()
包装器(例如,在原始格式之前和之后添加一些内容)。
我可以使用宏来实现这一点:
#define DECORATED_PRINT(fmt, ...) std::println("prefix " fmt " suffix", __VA_ARGS__)
但我更喜欢一个(模板)函数,具有完美的转发、编译时间检查和流锁定。
以下方法有效,但它不是线程安全的(除非我用额外的互斥体保护它):
template<typename...Args>
void decoratedPrint(std::format_string<Args...> fmt, Args&&... args){
std::print("prefix ");
std::print(fmt, std::forward<decltype(args)>(args)...);
std::println(" suffix");
}
是否可以使用修改后的格式对 std::print() 进行一次调用?像这样的东西:
template<typename...Args>
void decoratedPrint(std::format_string<Args...> fmt, Args&&... args){
std::print("prefix " fmt " suffix", std::forward<decltype(args)>(args)...);
}
一个想法是拥有一个
thread_local
缓冲区,分 3 步写入(前缀、内容、后缀),然后将其传递给 std::print()。
还有更好的选择吗?
std::runtime_format
。
template<typename...Args>
void decoratedPrint(std::format_string<Args...> fmt, Args&&... args) {
std::print(
std::runtime_format(std::string("prefix ") + std::string(fmt) + " suffix"),
std::forward<decltype(args)>(args)...
);
}