Boost.Program_Options:为什么 options_description_easy_init::operator() 没有 std::string 的重载?
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 代码量(原始代码使用通知程序,为简单起见已将其删除,但添加了更多样板文件) .
令我惊讶的是,there is no options_description_easy_init::operator()
overload that accepts std::string
, thus the example fails to compile.
虽然我可以通过在 for 循环中对 k
和 v
调用 .c_str()
来轻松地使示例工作,当然 this would be dangerous。 boost 开发者遗漏如此重要的过载有什么原因吗?他们为什么不首先使用 const std::string&
作为参数?
没有 .c_str()
我怎样才能使这段代码工作?没有迹象表明指针内存将在内部复制(无论如何这都很奇怪)而且我真的不想回到过去并自己管理内存:-)
调查 implementation, it seems that internally the const char*
argument passed to options_description_easy_init::operator()
is wrapped by a new option_description
object, which eventually converts the argument into a std::string
。因此,正如@pptaszni 评论的那样,在std::string
参数上调用.c_str()
以将它们传递给程序选项是 安全的。
然而,我仍然不明白的是为什么没有 std::string
重载。我认为这是一个设计缺陷(同时考虑到 options_description
有一个 constructor taking 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 代码量(原始代码使用通知程序,为简单起见已将其删除,但添加了更多样板文件) .
令我惊讶的是,there is no options_description_easy_init::operator()
overload that accepts std::string
, thus the example fails to compile.
虽然我可以通过在 for 循环中对 k
和 v
调用 .c_str()
来轻松地使示例工作,当然 this would be dangerous。 boost 开发者遗漏如此重要的过载有什么原因吗?他们为什么不首先使用 const std::string&
作为参数?
没有 .c_str()
我怎样才能使这段代码工作?没有迹象表明指针内存将在内部复制(无论如何这都很奇怪)而且我真的不想回到过去并自己管理内存:-)
调查 implementation, it seems that internally the const char*
argument passed to options_description_easy_init::operator()
is wrapped by a new option_description
object, which eventually converts the argument into a std::string
。因此,正如@pptaszni 评论的那样,在std::string
参数上调用.c_str()
以将它们传递给程序选项是 安全的。
然而,我仍然不明白的是为什么没有 std::string
重载。我认为这是一个设计缺陷(同时考虑到 options_description
有一个 constructor taking std::string
)。