使用花括号/方括号为std::string赋值

4
如果这是有效的:
unsigned char buffer[] = {
 0x01, 0x02, 0x03, 0x04
};

这是否也适用于std::string,例如:
std::string buffer = {
 0x01, 0x02, 0x03, 0x04
};

如果没有,我该如何插入这样的值?
2个回答

9

在C++03中不行,但在C++11中可以这样做:

 std::string buffer = { 0x01, 0x02, 0x03, 0x04 }; //C++011 ONLY

演示:http://www.ideone.com/1cOuX。在演示中,我只是为了演示而使用可打印的字符('A''B'等)。


在C++03中,由于@andrewdski提供的解决方案被公认为丑陋,因此您可以尝试以下方法:

    unsigned char values[] = {0x01, 0x02, 0x03, 0x04 };
    std::string buffer(values, values + sizeof(values));

这是一种更为简洁的方法。如果您想在以后添加更多的值,则可以这样做:
unsigned char more_values[] = {0x05, 0x06, 0x07, 0x08 };
buffer.insert(buffer.end(), more_values, more_values+ sizeof(more_values));

如果你想从其他的std::string中添加值,可以这样做:

//add values from s to buffer
buffer.insert(buffer.end(), s.begin(), s.end());

这与以下内容相同:

buffer += s; //cool 

顺便提一下,您可以编写一个名为“join”的小工具来完成此操作,还可以做其他有趣的事情:
std::string s = join() + 'A' + 'B' + 'C' + 'D';

您甚至可以在单个join语句中混合不同类型,如下所示:
std::string s = join() + 'A' + 'B' + 'C' + 'D' + "haha" + 9879078;

即使在C++011中,使用{}方法也无法实现这一点。

以下是该工具的实用性和完整演示:

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

struct join
{
   std::stringstream ss;
   template<typename T>
   join & operator+(const T &data)
   {
        ss << data;
        return *this;
   }
   operator std::string() { return ss.str(); }
};

int main() {
        std::string s1 = join() + 'A' + 'B' + 'C' + 'D';
        std::cout << s1 << std::endl;
        std::string s2 = join() + 'A' + 'B' + 'C' + 'D' + "haha" + 9879078;
        std::cout << s2 << std::endl;
}

输出:

ABCD
ABCDhaha9879078

在线演示:http://www.ideone.com/3Y7pB

然而,此工具需要使用特定的值进行转换,以便将其插入到字符串中,例如:

std::string buffer=join()+ (char)0x01 +(char)0x02 + (char)0x03 + (char)0x04;

不太酷,诚然。需要使用cast,否则每个值都将被视为int类型,这是您不想要的。因此,我会提倡之前展示的更清晰的方法。但是,这个实用程序可以在其他一些情况下帮助您。有时尝试使用C++运算符和功能也是好的。 :D


2
是的,这要归功于存在std::string(std::initializer_list<char>)构造函数。 - ephemient

7
std::string buffer = "\x01\x02\x03\x04"

这有点丑,但它能工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接