繁体   English   中英

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

[英]Boost.Program_Options: Why does options_description_easy_init::operator() not have an overload for std::string?

考虑这个 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 代码的数量(原始代码使用通知程序,为了简单起见,这些通知程序已被删除,但添加了更多样板文件)。 令我惊讶的是,没有接受std::string options_description_easy_init::operator()重载,因此该示例无法 compile

虽然我可以通过在 for 循环中对kv调用.c_str()来轻松地使示例工作, .c_str()当然会很危险 有什么理由让 boost 开发人员遗漏了如此重要的过载? 为什么他们不首先使用const std::string&作为参数?

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

查看实现,似乎在内部传递给options_description_easy_init::operator()const char*参数由一个新的option_description对象包装,该对象最终将参数转换为std::string 因此,作为由@pptaszni评论说,这是安全地调用.c_str()std::string参数将它们传递给程序选项。

然而,我仍然不明白的是为什么没有std::string重载。 我认为这是一个设计缺陷(也考虑到options_description有一个采用std::string构造函数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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