考虑此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,如何使此代码起作用?没有迹象表明指针内存将在内部复制(无论如何这都是奇怪的),我真的不希望回到过去并自己管理内存:-)
[查看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()
)。