c++ - 无需内存分配即可将 std::stringstream 转换为 const char**

标签 c++ opencl std stringstream

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

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

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

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

编辑

后续问题:

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

最佳答案

通过获取 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 promise 在调用 clCreateProgramWithSource 后我们不会写入字符串流。

关于c++ - 无需内存分配即可将 std::stringstream 转换为 const char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14414063/

相关文章:

c++ - 如何计算图像的分辨率?

c++ - 有没有办法简单地连接多个 vector ?

c++ - OpenCL 中的暴力破解(来自 CUDA 的端口)不起作用

c++ - std::locale 取得所有权

c++ - 从 std::map 多个键中删除的最佳技术

c++ - C++11 中是否有一个范围类可用于基于范围的 for 循环?

javascript - 使用 Emscripten Worker API 传输数据而不复制

c++ - Arduino 静态变量声明没有数据类型?

c++ - 键/值数组的双调排序

c++ - opencl clCreateImage clCreateImage2D