我正在使用Vulkan,我正在尝试将验证层作为vector<string>
传递。但VkInstanceCreateInfo中的字段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();
答案 0 :(得分:2)
以下是std::string
:
const std::string str = "test";
const char* str_p = str.c_str();
const char* const* ppEnabledExtensionNames = &str_p;
如果c_str()
是被删除的临时字符串的一部分,请务必小心。您可能需要保留对基本字符串对象的引用,直到您完成此操作。
答案 1 :(得分:2)
使用rules = (
Rule(LinkExtractor(restrict_xpaths="//a[contains(@href,'.html')]"), follow=True),
Rule(LinkExtractor(allow=('.*\.html',)), callback='parse_item')
)
,您将获得c_str
。 const char*
是const char* const*
的数组。
const char*
答案 2 :(得分:0)
这就是您在代码段中所做的事情:
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 ++友好的界面,但我无法解决这个问题。
答案 3 :(得分:0)
我今天早上使用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;