5

据我了解, astd::stringstream在内部不是表示为 anstd::string而是表示为一组std::string实例。(如果我错了,请纠正我)。

我有表示为 an 的数据std::stringstream,我想将它传递给一个 C 函数(clCreateProgramWithSource来自 OpenCL),该函数期望数据作为字符数组的数组。( const char**).

是否有某种方法可以在首先创建包含字符串流的全部内容的单个字符串的情况下执行此操作,例如通过以下方式:

std::string tmp1 = my_stringstream.str();
const char* tmp2 = tmp1.c_str();
const char** tmp3 = &tmp2;

编辑

后续问题:

如果这是不可能的,是否有一些替代方法std::stringstream,继承自std::ostream,允许这种低级访问?

4

1 回答 1

1

通过获取 stringstream 的 streambuf,我们可以显式设置它应该使用的缓冲区:

#include <sstream>

constexpr size_t buffer_size = 512;

void dummy_clCreateProgramWithSource(const char **strings) {}

int main () {
  char * ss_buffer = new char[buffer_size];
  std::stringstream filestr; // TODO initialize from file
  filestr.rdbuf()->pubsetbuf(ss_buffer,buffer_size);
  const char** extra_indirection = const_cast<const char **>(&ss_buffer);
  dummy_clCreateProgramWithSource(extra_indirection);
  return 0;
}

注意 const_cast 告诉什么可能是谎言;我们向 OpenCL 保证在调用 clCreateProgramWithSource 后我们不会写入字符串流。

于 2020-06-26T12:21:56.477 回答