考虑这个 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 开发者遗漏了如此重要的过载?他们为什么不首先用作论据?k
v
const std::string&
我怎样才能让这段代码在没有 的情况下工作.c_str()
?没有迹象表明指针内存将在内部复制(无论如何这会很奇怪),我真的不想回到过去并自己管理内存:-)