gpt4 book ai didi

c++ - Boost.Program_Options:为什么options_description_easy_init::operator()没有对std::string的重载?

转载 作者:行者123 更新时间:2023-12-02 10:21:58 24 4
gpt4 key购买 nike

考虑以下MCVE:

#include <boost/program_options.hpp>
#include <iostream>
#include <map>

namespace po = boost::program_options;
using namespace std;

po::options_description createOptions(const std::string& description, const map<string, string>& opts) {
po::options_description newoptions(description);

for (const auto& [k, v] : opts) {
newoptions.add_options()(k, v);
}
return newoptions;
}

int main() {

map<string, string> descMap = {
{ "key", "description" },
{ "hello", "world" }
};

auto opts = createOptions("My options", descMap);

cout << opts << endl;
}

我正在尝试编写一个便利函数,以在将类似的选项插入 options_description对象中时减少C&P代码的数量(原始代码使用了为简化起见而被删除的通知程序,但添加了更多样板)。
令我惊讶的是 there is no options_description_easy_init::operator() overload that accepts std::string ,因此是示例 fails to compile

尽管我可以通过在for循环中的 .c_str()k上调用 v来轻松地使示例工作,但当然是 this would be dangerous。助推开发人员为何没有这么重要的过载呢?他们为什么不首先使用 const std::string&作为参数?

而如何在没有 .c_str()的情况下使此代码起作用?没有迹象表明指针内存将在内部复制(无论如何这都是奇怪的),我真的不希望回到过去并自己管理内存:-)

最佳答案

查看implementation时,似乎内部传递给const char*options_description_easy_init::operator()参数是由new option_description object包裹的,最后是converts the argument into a std::string 。因此,正如@pptaszni所评论的那样,可以安全地调用.c_str()参数上的std::string并将它们传递给程序选项。

但是,我仍然不明白的是为什么没有std::string重载。我认为这是一个设计缺陷(也考虑到options_description具有constructor taking std::string )。

关于c++ - Boost.Program_Options:为什么options_description_easy_init::operator()没有对std::string的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59773454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com