Boost.Program_Options: Почему у options_description_easy_init :: operator () нет перегрузки для std :: string? - PullRequest
1 голос
/ 16 января 2020

Рассмотрим этот 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()? Нет никаких указаний на то, что память указателя будет скопирована изнутри (что было бы странно в любом случае), и я действительно не хочу возвращаться во времени и управлять памятью самостоятельно: -)

1 Ответ

1 голос
/ 17 января 2020

Рассматривая реализацию , кажется, что внутренне аргумент const char*, переданный options_description_easy_init::operator(), обернут новым option_description объектом , который в конечном итоге преобразует аргумент в std::string. Таким образом, как прокомментировал @pptaszni, безопасно вызывать .c_str() для аргументов std::string, чтобы передать их параметрам программы.

Что я до сих пор не понимаю, однако , поэтому нет перегрузки std::string. Я считаю это недостатком дизайна (также учитывая, что options_description имеет конструктор , принимающий std::string).

...