![](/img/trans.png)
[英]Convert const std::vector<std::string> to const char **
[英]Convert std::vector<std::string> to const char* const*
我正在使用Vulkan,并且正在尝试将验证层作为vector<string>
传递。 但是ppEnabledLayerNames
的ppEnabledLayerNames字段仅采用const char* const*
。 我不了解类型以及如何将向量的数据转换为它。
std::vector<std::string> v = {
"VK_LAYER_LUNARG_standard_validation"
};
const char* const* data = std::accumulate(std::next(v.begin()), v.end(),
v[0],
[](std::string a, std::string b) {
return a + b;
}).c_str();
但是当我编译时,我得到了:
error: cannot convert ‘const char*’ to ‘const char* const*’ in assignment
}).c_str();
这是在std::string
上执行此操作的方法:
const std::string str = "test";
const char* str_p = str.c_str();
const char* const* ppEnabledExtensionNames = &str_p;
如果c_str()
是要删除的临时字符串的一部分,请小心。 在完成此操作之前,您可能需要保留对基本字符串对象的引用。
使用c_str
您将获得const char*
。 const char* const*
是const char*
的数组。
vector<string> vectorOfStrings = {
"Aa",
"Bb",
"Cc"
};
vector<const char*> vectorOfCStyleStrings(3);
// convert from string to C style strings
for (string item : vectorOfStrings)
vectorOfCStyleStrings.push_back(item.c_str());
// get vector like a const C style array
const char* const* arrayOfCStyleStrings = vectorOfCStyleStrings.data();
这是您在代码段中所做的:
v
所有字符串(如果v
为空,则崩溃); const char
的悬空指针分配给const char* const*
。 最后一部分没有编译,但这是一件好事-在运行时处理这个问题会令人遗憾。
通过界面的外观(即ppEnabledLayerNames
参数),您可能会猜到您不想首先串联字符串,而是想传递一个c字符串数组。
这是从vector<string>
获取它的方法:
vector<const char*> layer_names(v.size());
std::transform(v.begin(), v.end(), layer_names.begin(), [](const string& s)
{ return s.c_str(); });
const char* const* data = layer_names.data();
注意,它只有在layer_names
或v
被销毁之前才有效。
更好的方法是找到Vulkan的C ++友好接口,但是我对此无能为力。
我终于今天早上使用std::accumulate
找到了解决方案
auto d = std::accumulate(
std::next(v.begin()), v.end(),
v[0],
[](std::string a, std::string b) {
return a + b;
}).c_str();
const char* const* data = &d;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.