使用花括号/括号将值赋给std :: string

fre*_*nix 4 c++

如果这是有效的:

unsigned char buffer[] = {
 0x01, 0x02, 0x03, 0x04
};
Run Code Online (Sandbox Code Playgroud)

这是否也适用于std :: string,例如

std::string buffer = {
 0x01, 0x02, 0x03, 0x04
};
Run Code Online (Sandbox Code Playgroud)

如果没有,我该如何插入这些值?

Naw*_*waz 9

不是在C++ 03中,但您可以在C++ 011中执行此操作:

 std::string buffer = { 0x01, 0x02, 0x03, 0x04 }; //C++011 ONLY
Run Code Online (Sandbox Code Playgroud)

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


在C++ 03中,由于@andrewdski给出的解决方案无疑是丑陋的,你可以这样做:

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

这是一个更清洁的方法.如果您想稍后添加更多值,那么您可以这样做:

unsigned char more_values[] = {0x05, 0x06, 0x07, 0x08 };
buffer.insert(buffer.end(), more_values, more_values+ sizeof(more_values));
Run Code Online (Sandbox Code Playgroud)

如果你想从其他人添加值std::string,那么你可以这样做:

//add values from s to buffer
buffer.insert(buffer.end(), s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)

这与:

buffer += s; //cool 
Run Code Online (Sandbox Code Playgroud)

顺便join说一下,除了其他有趣的东西之外,你还可以编写一个名为的小工具:

std::string s = join() + 'A' + 'B' + 'C' + 'D';
Run Code Online (Sandbox Code Playgroud)

您甚至可以在一个join语句中混合使用不同类型:

std::string s = join() + 'A' + 'B' + 'C' + 'D' + "haha" + 9879078;
Run Code Online (Sandbox Code Playgroud)

{}即使在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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

ABCD
ABCDhaha9879078
Run Code Online (Sandbox Code Playgroud)

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

但是,此实用程序需要使用您要插入字符串的特定值进行强制转换:

std::string buffer=join()+ (char)0x01 +(char)0x02 + (char)0x03 + (char)0x04;
Run Code Online (Sandbox Code Playgroud)

不可否认,没有那么酷.需要强制转换,否则每个值都将被视为int您不想要的类型.所以我会主张前面提到的清洁方法.但是这个实用程序可以在其他情况下帮助您.有时可以尝试使用C++运算符和功能.:d

  • 是的,这要归功于`std :: string(std :: initializer_list <char>)`构造函数的存在. (2认同)

and*_*ski 7

std::string buffer = "\x01\x02\x03\x04"
Run Code Online (Sandbox Code Playgroud)

有点难看,但它有效.