C++ 程序选项变量映射更改参数

C++ 程序选项变量映射更改参数,c++,boost-program-options,C++,Boost Program Options,在此代码中 po::options_description desc(prog + " Allowed options"); desc.add_options() ("help,h", "produce help message") ("version,v", "outputs Version of program") ("day,d", po::value<date>()->default_value(day_c

在此代码中

    po::options_description desc(prog + " Allowed options");
    desc.add_options()
        ("help,h", "produce help message")
        ("version,v", "outputs Version of program")
        ("day,d", po::value<date>()->default_value(day_clock::universal_day()- single_day), "specific day format YYYY-MM-DD (default not today but today-singleday=yesterday)")
        ("startdate,s", po::value<date>()->default_value(day_clock::universal_day()), "start date format YYYY-MM-DD (default today)")
        ("enddate,e", po::value<date>()->default_value(day_clock::universal_day()), "end date format YYYY-MM-DD (default today)")
        ("thread,t", po::value<int>()->default_value(20), "number of threads (default 20)")
        ("folder,f", po::value<fs::path>()->default_value(path), "destination folder (default .)")
        ("candle,c", po::value<timeframe_enum>()->default_value(timeframe_enum::TICK, "TICK"), "use candles instead of ticks. Accepted values TICK M1 M2 M5 M10 M15 M30 H1 H4")
        ("header", po::value<bool>()->default_value(false), "include CSV header (default false)")
        ("symbols", po::value<std::vector<symbols_enum>>()->multitoken()->composing()->default_value(symbols_default, "GBPJPY"), "symbol list using format EURUSD EURGBP")
        ;
    po::positional_options_description pd;
    pd.add("symbols", -1);

    command_line_parser parser{ argc, argv };
    parser.options(desc).positional(pd);
    parsed_options parsed_options = parser.run();

    po::variables_map vm;
    po::store(parsed_options, vm);
    po::notify(vm);

    if (!vm.count("startdate"))
    {

        vm["startdate"] = vm["day"].as<date>();
    }
po::options_description desc(prog+“允许的选项”);
说明添加选项()
(“帮助,h”,“生成帮助消息”)
(“版本,v”,“输出程序版本”)
(“日,d”,po::value()->默认值(日时钟::通用日()-单日),“特定日格式YYYY-MM-DD(默认不是今天,而是今天单日=昨天)”)
(“开始日期,s”,po::value()->默认值(日时钟::通用日()),“开始日期格式YYYY-MM-DD(默认今天)”)
(“结束日期,e”,po::value()->默认值(day\u clock::universal\u day()),“结束日期格式YYYY-MM-DD(今天默认)”)
(“线程,t”,po::value()->默认值(20),“线程数(默认值20)”)
(“文件夹,f”,po::value()->默认值(路径),“目标文件夹(默认)”)
(“蜡烛,c”,po::value()->默认_值(时间范围_枚举::勾选,“勾选”),“使用蜡烛代替勾选。接受值勾选M1 M2 M5 M10 M15 M30 H1 H4”)
(“标题”,po::value()->默认值(false),“包含CSV标题(默认值false)”)
(“符号”,po::value()->multitoken()->composing()->默认值(符号默认值,“GBPJPY”),“使用EURUD EURGBP格式的符号列表”)
;
po::位置选项描述pd;
pd.添加(“符号”、-1);
命令行解析器{argc,argv};
parser.options(desc).positional(pd);
parsed_options parsed_options=parser.run();
变量映射虚拟机;
po::store(解析的_选项,vm);
po::通知(vm);
如果(!vm.count(“startdate”))
{
vm[“startdate”]=vm[“day”].as();
}
在最后一条if语句中,当我试图通过订阅来更改变量映射时,它给出了错误。

是否可以在store()之后更改变量映射?

变量\u映射扩展标准库映射,并覆盖下标运算符,如下所示:

const variable_value & operator[](const std::string & name) const;
这意味着您不能更改该值,因为它是常量引用。 查看门店代码,我看到以下几行:

    // We need to access map's operator[], not the overriden version
    // variables_map. Ehmm.. messy.
    std::map<std::string, variable_value>& m = xm;
//我们需要访问map的操作符[],而不是覆盖的版本
//变量映射。嗯。。凌乱的
std::map&m=xm;
这可能意味着你可以自己尝试做类似的事情。
但是考虑到API,很明显,这个类的编写者试图阻止您做这样的事情,所以这可能是不安全的。

非常感谢。我将尝试使用vm元素,如果与vm分离,我会这样做