Рассмотрим этот 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;
}
Я пытаюсь написать вспомогательную функцию, чтобы уменьшить количество кода C & P при вставке аналогичных параметров в объект options_description
(исходный код использует удаленные уведомители для простоты, но добавьте еще больше шаблона). К моему удивлению, нет перегрузки options_description_easy_init::operator()
, которая принимает std::string
, таким образом, пример не может скомпилировать .
Хотя я мог бы легко заставить пример работать позвонив .c_str()
на k
и v
в течение для l oop, конечно это будет опасно . Есть ли причина, по которой разработчики наддува исключили такую важную перегрузку? Почему они не использовали const std::string&
в качестве аргумента в первую очередь?
А как я могу заставить этот код работать без .c_str()
? Нет никаких указаний на то, что память указателя будет скопирована изнутри (что было бы странно в любом случае), и я действительно не хочу возвращаться во времени и управлять памятью самостоятельно: -)