假设我有一个 C++ 函数
void foo(std::string str) {
std::cout << str << "\n";
}
现在,在等效的 Java 中,我可以使用各种类型的组合调用该函数,并且它会自动连接,例如:
foo("test " + intValue + " " + stringValue + "...");
这在 C++ 中不起作用,但是在现代 C++ 中有没有办法实现相同的目标?我找到的唯一解决方案是创建一个 stringstream
变量并在那里进行连接。然而,对于这样一个常见的用例来说,这似乎是一个很大的开销。
答案 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 + "...");