将std :: vector <std :: string>作为C风格字符串数组传递(char **)</std :: string>

时间:2013-10-11 20:20:34

标签: c++ opengl c++11

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

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

有可能吗?

4 个答案:

答案 0 :(得分:12)

首先使用std::string的{​​{1}}函数将它们映射到.c_str()

const char*

然后通过vector的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()

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

如果空间对您非常重要,您可以使用

提前在向量中保留空间
glTransformFeedbackVaryings( ... , c_strs.size(), c_strs.data(), ...);

或用

转换后
c_strs.reserve(strings.size());

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

std::vector<const char*> arr;
for(auto&& str:vec)
  arr.push_back(str.c_str());

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

上述情况,如果vecstd::string的向量,则会使用foo致电char const**

char const**vec都有效时,此arr有效。

如果你的api实际上会服从const但是const不支持const_cast,那么删除char**是可能的(例如,如果您有遗留的API需要一个实际的const_cast,你可以data() {{1}}打电话给我怀疑的。)

答案 3 :(得分:0)

std::vector<const char*> arg( strvect.size() );
for( std:: size_t i=0; i < arg. size(); ++i)
{
  arg[i] = strvect[i].c_str();
}

然后使用&amp; arg [0]。