我想将std :: strings的向量传递给OpenGL作为C样式的空终止字符数组(const char **)的数组。
void glTransformFeedbackVaryings(GLuint program,
GLsizei count,
const char **varyings,
GLenum bufferMode);
有可能吗?
答案 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(),...);
上述情况,如果vec
是std::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]。