将std :: vector <std :: string>转换为const char * const *

时间:2017-07-09 06:05:34

标签: c++ vector c++17

我正在使用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();

Here's a live example

4 个答案:

答案 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_strconst 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_namesv被销毁之前它才有效。

更好的方法是为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;