有没有一种简单的方法将字符串组合为函数参数?

时间:2021-01-23 10:09:54

标签: c++ string

假设我有一个 C++ 函数

void foo(std::string str) {
    std::cout << str << "\n";
}

现在,在等效的 Java 中,我可以使用各种类型的组合调用该函数,并且它会自动连接,例如:

foo("test " + intValue + " " + stringValue + "...");

这在 C++ 中不起作用,但是在现代 C++ 中有没有办法实现相同的目标?我找到的唯一解决方案是创建一个 stringstream 变量并在那里进行连接。然而,对于这样一个常见的用例来说,这似乎是一个很大的开销。

3 个答案:

答案 0 :(得分:1)

您可以将 std::stringstream 包装在一个函数中并使用它:

#include <string>
#include <sstream>


void foo(std::string){}

template<typename...Args>
std::string concat(Args&&...args){
    std::stringstream ss;
    (ss << ... << args);
    return ss.str();
}

int main(){
    int intValue=12;
    std::string stringValue="hello";
    foo(concat("test ",intValue," ",stringValue,"..."));
}

std::string 支持通过 + 进行连接,但原始类型不支持。因此,您可以将它们包装在 std::to_string 中,但这不太好。

允许 "hello"+5 太危险了,因为 "hello"const char* 的一个简单步骤,std::format 会触发指针运算。

从 C++20 开始,有 {'user': usr , 'commented':comment}

答案 1 :(得分:1)

您可以创建一个字符串生成器类来稍微包装 std::stringstream 的样板:

#include <iostream>
#include <string>
#include <sstream>

struct Builder {

    std::stringstream s;

    template<typename T>
    Builder(const T& x) {
        s << x;
    }

    template<typename T>
    friend Builder&& operator+(Builder&& b, const T& val) {
        b.s << val;
        return std::move(b);
    }

    operator std::string() const {
        return s.str();
    }
};

呼叫站点可以这样使用它:

foo(Builder("test ") + 3 + " " + "stringValue" + "...");

现场示例here

答案 2 :(得分:0)

您可以通过对整数值使用 to_string() 来实现相同的效果。

foo("test " + to_string(intValue) + " " + stringValue + "...");