有没有办法使用operator +在c ++中连接std :: strings?

时间:2015-09-29 20:26:20

标签: c++

我有这样的功能

void foo (const char* myString){
...
}

我希望像这样使用它

std::string tail = "something";
foo("my" + "string" + tail);

但我找不到一个简单的方法。我肯定可以将字符串放在其他地方并将其传递给foo()。但是我更喜欢找到一种内联方式,因为在代码中多次调用foo(),我不想每次都创建一个字符串。我试过了

foo(std::string ("my" + "string" + tail).c_str())

但你可以猜测它不起作用。

5 个答案:

答案 0 :(得分:1)

只需确保“我的”是std::string,然后您就可以使用std::string::operator+运算符。之后,您会在结果.c_str()上使用std::string

然后,如果您可以更改foo,最好是让它接受const char*

void foo (const char* myString)
{
    ...
}

std::string tail = "something";
foo( (std::string("my") + "string" + tail).c_str() );

如果您无法更改foo,那么您必须进行投射,因为c_str()返回const char*foo想要char*

void foo (char* myString)
{
    ...
}

std::string tail = "something";
foo( const_cast<char*>( (std::string("my") + "string" + tail).c_str() ) );

答案 1 :(得分:1)

"my""string"是C风格的字符串。它们的类型为const char *,您不能将operator +用于这些操作数。但是您可以使用此运算符,任何操作数都是string

所以最优雅的方式是添加括号:

foo(("my" + ("string" + tail)).c_str());

您还必须将功能foo更改为

void foo (const char* myString)

答案 2 :(得分:1)

"my""string"是C样式的字符串文字,如果它们是而不是 a +,则它们会被连接起来。 / p>

因此"my" "string" + tail将起作用,并生成std::string。但是,除非您对结果使用.c_str(),否则它仍然不是您的函数的正确类型。

答案 3 :(得分:1)

你的函数接受char的一个可修改的数组(不再是OP,在他的编辑中改变了)std::string而不是一个char的数组,但是一些不相关的对象(提供读取 - 访问其内部char缓冲区,但这并不能使它成为某种漂亮的数组)。

此外,使用.c_str() - 指向被破坏的字符串对象的指针是一个常见的错误。即使你的函数是接受const char*,你需要知道传入它的指针只有在创建临时std::string对象的完整表达式结束时才有效。可能会或可能不是你想要的,但你需要注意的是。正如我所说,人们常常弄错了。

所以std::string可能(在新的const char*设置中,它可能)不适合这项工作,因为它现在被描述。 最好的解决方案是将foo()的参数设为std::string(某些参考变体,取决于它正在做什么)。然后,只要第一个加数之一已经是+,就可以将输入与std::string连接起来。

如果无法做到这一点,请将字符复制到std::vector<char>,这实际上是C ++获取char数组的方式(同样,string不同)。

答案 4 :(得分:0)

代码foo("my" + "string" + tail);因两个原因无效。首先是运营商的顺序。代码尝试执行“my”+“string”,因为这两个都是字符串文字,代码失败。 (你不能加两个字符串文字)。第一个问题是,如果你神奇地使“my”+“string”工作,代码会将它与tail连接,产生有效的std :: string,但是无法将它传递给foo()。

如何解决问题?

  1. 更改foo()签名。如果您必须使用char *,请将其设为foo(const char* ),或者更好地将其替换为foo(const std::string&)
  2. 使用以下内容连接:foo(std::string("my") + "string" + tail)如果您遵循我的建议并使foo接受const std :: string&amp;或foo((std::string("my") + "string" + tail).c_str()),如果您没有。
  3. 另外,由于“my”和“string”在编译时都是已知的,所以最好有简单的foo(“mystring”+ tail) - 更容易阅读,性能更好。