std::print() 格式已更改的包装器

问题描述 投票:0回答:1

我尝试创建一个具有修改格式的

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()。 还有更好的选择吗?

https://godbolt.org/z/rEY4Md4YK

c++ wrapper c++23 stdformat
1个回答
0
投票

是的,您有

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)...
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.