如何传递字符串以在std::format中使用?
如何传递字符串以在std::format中使用?
我一直尝试传递一个格式字符串给
std::format调用,但始终找不到可行的方法。这到底能不能实现?还是说我必须为每种预期的格式都单独写一个方法?我使用的是FreeBSD 14.2上的clang 19.1.4,编译选项设置为
-std=c++20简化示例代码:
#include <format> #include <iostream> using namespace std; class mytest { int m_one = 1; int m_two = 2; public: string toString(const string& fmt) { // 这里想使用传入的fmt来格式化m_one和m_two,比如像std::format(fmt, m_one, m_two)这样 // 但直接这么写会报错,该怎么处理? } }; int main() { mytest t; cout << t.toString("One: {}, Two: {}") << endl; cout << t.toString("Two first: {1}, One second: {0}") << endl; }
没问题,你当然可以传递自定义格式字符串给std::format相关调用,完全不用为每种格式单独写方法!问题出在C++20里std::format本身要求格式字符串是编译期常量,直接传运行时的std::string参数自然会报错。
不过有两种很实用的解决办法,看你需求选:
方法一:用
std::vformat(最贴合你的需求)std::vformat是std::format的运行时版本,专门用来处理动态传入的格式字符串,搭配std::make_format_args打包参数就行。修改你的toString方法如下:string toString(const string& fmt) { return std::vformat(fmt, std::make_format_args(m_one, m_two)); }这样不管你传什么格式字符串,不管是字面量还是运行时生成的,都能正常格式化
m_one和m_two,完全满足你的场景。方法二:编译期检查格式字符串(可选)
如果你希望格式字符串的正确性在编译期就被检查(比如占位符数量不匹配直接报错),可以把toString改成模板函数,让格式字符串作为模板参数:template <std::size_t N> string toString(const char (&fmt)[N]) { return std::format(fmt, m_one, m_two); }这种方式的好处是提前发现格式错误,但缺点是只能传字符串字面量,没法传运行时生成的动态字符串。
根据你的描述,第一种方法应该是最适合的,毕竟你就是想灵活传递任意格式的字符串参数。
备注:内容来源于stack exchange,提问作者sambler
相关产品推荐
相关产品推荐

