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

问题描述 投票:1回答:1

考虑此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,因此是示例options_description_easy_init::operator()

虽然我可以通过在for循环内,当然是std::string上的fails to compile.c_str()上调用k来轻松地使示例工作。助推开发人员为何没有这么重要的过载?他们为什么不首先使用v作为参数?

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

c++ boost c++17 boost-program-options c-str
1个回答
0
投票

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

但是,我仍然不明白为什么没有converts the argument into a std::string重载。我认为这是一个设计缺陷(也考虑到std::string具有.c_str())。

© www.soinside.com 2019 - 2024. All rights reserved.