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

虽然我可以通过调用 for 循环和.c_str()在for 循环内轻松地使示例工作,但这当然是危险的。为什么 boost 开发者遗漏了如此重要的过载?他们为什么不首先用作论据?kvconst std::string&

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

4

1 回答 1

1

查看实现,似乎在内部const char*传递给的参数options_description_easy_init::operator()被一个option_description对象包装,最终将参数转换为std::string. 因此,正如@pptaszni 所评论的那样,调用参数以将它们传递给程序选项.c_str()安全的。std::string

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

于 2020-01-17T07:49:49.673 回答