Получение параметров программы повышения для сохранения после области действия функции

У меня есть функция, которая принимает boost::program_options::options_description, добавляет некоторые параметры, а затем возвращает обратно. Кажется, что мои параметры не сохраняются после того, как область действия функции заканчивается, и мои параметры исчезают. Как заставить их сохраняться?

#include <boost/program_options.hpp>
#include <utility>


void generic_args(boost::program_options::options_description desc, boost::program_options::positional_options_description p) {
    desc.add_options()
        ("input", boost::program_options::value<std::vector<std::string>>(), "input files")
        ("help,h", "produce help message")
        ("verbose,v", "put the pretty words and numbers on the light screen");

    p.add("input", -1);
}

int main(int argc, const char** argv) {
    boost::program_options::options_description desc("Allowed options");
    boost::program_options::positional_options_description p;
    generic_args(desc, p);
    boost::program_options::variables_map parameters;
    boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(desc).positional(p).run(), parameters);
    boost::program_options::notify(parameters);
    return 0;
}

Вот результат:

scott@beast:~/test/test_args$ g++ -std=c++11 main.cpp -o a.out -lboost_program_options
scott@beast:~/test/test_args$ ./a.out
scott@beast:~/test/test_args$ ./a.out --help
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> >'
  what():  unrecognised option '--help'
Aborted (core dumped)

person Him    schedule 30.10.2017    source источник
comment
Я бы посоветовал изучить хотя бы базовый C++, прежде чем копаться в сторонних библиотеках. Используйте эталонные параметры.   -  person Benjamin Lindley    schedule 30.10.2017
comment
Я программист на питоне. Использование сторонних библиотек имеет для меня смысл. С моей точки зрения, управление памятью C++ — это продвинутая тема. :)   -  person Him    schedule 30.10.2017


Ответы (1)


Вы должны изменить generic_args, чтобы принимать аргументы по ссылке:

void generic_args(boost::program_options::options_description &desc,
                  boost::program_options::positional_options_description &p)
{
  // ...
}

в настоящее время generic_args изменяет копию desc и p (они передаются по значению).

Взгляните на Передает ли C++ объекты по значению или ссылке? и В чем разница между передачей по ссылке и передачей по значению? подробнее.

person manlio    schedule 30.10.2017
comment
Понятно. Я привык к таким языкам, как Java и Python, где большие объекты ВСЕГДА передаются по ссылке. - person Him; 30.10.2017
comment
Добро пожаловать в C++, где ничто не является ссылкой, если только вы не сделаете это так. И как только вы усвоите это, вас будет кусать тот факт, что эти ссылки могут устареть. Хотя бы несколько (сотню) раз. Пока вы не научитесь всегда помнить о продолжительности жизни и отдавать предпочтение семантике значений. - person sehe; 31.10.2017