[英]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 循环中对k
和v
调用.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.