加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 可以通过Boost Program_options分隔逗号分隔的参数值

发布时间:2020-12-16 09:28:24 所属栏目:百科 来源:网络整理
导读:如果我的命令行是: prog --mylist=a,b,c 是否可以设置Boost的program_options以查看mylist参数的三个不同的参数值?我已将program_options配置为: namespace po = boost::program_options;po::options_description opts("blah")opts.add_options() ("mylis
如果我的命令行是:

> prog --mylist=a,b,c

是否可以设置Boost的program_options以查看mylist参数的三个不同的参数值?我已将program_options配置为:

namespace po = boost::program_options;
po::options_description opts("blah")

opts.add_options()
    ("mylist",std::vector<std::string>>()->multitoken,"description");

po::variables_map vm;
po::store(po::parse_command_line(argc,argv,opts),vm);
po::notify(vm);

当我检查mylist参数的值时,我看到一个值为a,c.我希望看到三个不同的值,用逗号分隔.如果我将命令行指定为:

> prog --mylist=a b c

要么

> prog --mylist=a --mylist=b --mylist=c

有没有办法配置program_options,以便它看到a,c作为三个值,每个值应插入到向量中,而不是一个?

我正在使用boost 1.41,g 4.5.0 20100520,并启用了c 0x实验扩展.

编辑:

接受的解决方案可行,但最终会变得更复杂,IMO,而不仅仅是迭代向量并手动分割值.最后,我接受了James McNellis的建议并以这种方式实施.然而,他的解决方案并没有作为答案提交,所以我从hkaiser接受了另一个正确的解决方案.两者都有效,但手动标记化更清晰.

解决方法

您可以为您的选项注册自定义验证器:

namespace po = boost::program_options;

struct mylist_option 
{
    // values specified with --mylist will be stored here
    vector<std::string> values;

    // Function which validates additional tokens from command line.
    static void
    validate(boost::any &v,std::vector<std::string> const &tokens)
    {
        if (v.empty())
            v = boost::any(mylist_option());

        mylist_option *p = boost::any_cast<mylist_option>(&v);
        BOOST_ASSERT(p);

        boost::char_separator<char> sep(",");
        BOOST_FOREACH(std::string const& t,tokens)
        {
            if (t.find(",")) {
                // tokenize values and push them back onto p->values
                boost::tokenizer<boost::char_separator<char> > tok(t,sep);
                std::copy(tok.begin(),tok.end(),std::back_inserter(p->values));
            }
            else {
                // store value as is
                p->values.push_back(t);
            }
        }
    }
};

然后可以用作:

opts.add_options()                 
    ("mylist",po::value<mylist_option>()->multitoken(),"description");

和:

if (vm.count("mylist"))
{
    // vm["mylist"].as<mylist_option>().values will hold the value specified
    // using --mylist
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读