You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何传递字符串以在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:28:13