将 std::vector<std::string> 转换为 const char* const*
Convert std::vector<std::string> to const char* const*
我正在使用 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();
这是一个活生生的例子
有了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();
这是一种在std::string
上执行此操作的方法:
const std::string str = "test";
const char* str_p = str.c_str();
const char* const* ppEnabledExtensionNames = &str_p;
如果c_str()
是被丢弃的临时字符串的一部分,请小心。在完成此操作之前,可能需要保留对基字符串对象的引用。
这是您在代码段中执行的操作:
- 连接
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;
相关文章:
- cppcheck在const std::string[]上引发警告
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 如何在旧c++中初始化const-std向量
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- r语言 - C++ 类型为"const std ::?
- std::move a const std::vector in a lambda capture
- 无法从'const std::string [3]'转换为'std::string'
- test1.cpp:9:77:错误:对"(const std::normal_distribution) <double>(std::mt19937&)"的调用不匹配
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 有效地初始化 const std::vector 类成员
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 为什么 std::unordered_map 不能与 const std::string 键一起使用?
- 无法在"catch(const std::exception &ex)"中捕获 std::invalid_argument
- 错误:C2679 二进制"==":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- 如何初始化 const std::vector<MyClass>
- 使用计数"const std::shared_ptr<...>"可变吗?
- 变量参数列表 后面的'const std::string&'弄乱了堆栈
- C++错误:将"const umap_int {aka const std::unordered_map<int, int>}"作为"this"参数会丢弃限定符 [-permissive]
- 不存在从"const std::string"到"time_t"的合适转换功能
- 无法从'std::string'中推断出'const std::reverse_iterator<_RanIt> &'的模板参数