2

我想将 std::strings 的向量作为 C 风格的空终止字符数组 (const char**) 的数组传递给 OpenGL。

void glTransformFeedbackVaryings(GLuint program,
                                 GLsizei count,
                                 const char **varyings,
                                 GLenum bufferMode);

可能吗?

4

4 回答 4

13

首先使用std::string'.c_str()函数将它们映射到const char*'s。

std::vector<const char*> c_strs;
std::transform(std::begin(strings), std::end(strings), 
               std::back_inserter(c_strs), std::mem_fn(&std::string::c_str));

然后通过.data()vector的成员将它传递给你的函数:

glTransformFeedbackVaryings( ... , c_strs.size(), c_strs.data(), ...);

用您的其他参数替换 ...。注意:我没有编译这段代码,但应该没问题(理论上)。

如果空间对您来说真的很重要,您可以提前在向量中保留空间

c_strs.reserve(strings.size());

或在转换后

c_strs.shrink_to_fit();
于 2013-10-11T20:29:15.297 回答
2

结构太不一样了。std::string 不仅仅包含一个指针,因此它不会直接映射到 char**。

您需要将字符串的 c_str() 值复制到新的 std::vector 中。然后您可以将该新向量的 .data 指针传递给 OpenGL。

于 2013-10-11T20:23:54.680 回答
0
std::vector<const char*> arr;
for(auto&& str:vec)
  arr.push_back(str.c_str());

foo(...,arr.data(),...);

上面,如果vec是你的向量std::string,将foo用 a调用char const**

char const**将是有效的,而两者vecarr有效。

const如果您的 api 实际上会遵守const但不支持它,那么删除是可能const_cast的(即,如果您有一个需要实际的遗留 API char**,您可以调用我怀疑的那个)const_castdata()

于 2013-10-11T20:35:54.550 回答
0
std::vector<const char*> arg( strvect.size() );
for( std:: size_t i=0; i < arg. size(); ++i)
{
  arg[i] = strvect[i].c_str();
}

然后使用 &arg[0]。

于 2013-10-11T20:40:20.663 回答