繁体   English   中英

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

[英]Convert std::vector<std::string> to const char* const*

我正在使用Vulkan,并且正在尝试将验证层作为vector<string>传递。 但是ppEnabledLayerNamesppEnabledLayerNames字段仅采用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_namesv被销毁之前才有效。

更好的方法是找到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM