C++ 使用Boost'处理复杂选项;s程序选项

C++ 使用Boost'处理复杂选项;s程序选项,c++,boost,parameters,graph,boost-program-options,C++,Boost,Parameters,Graph,Boost Program Options,我有一个程序,使用不同的多级模型生成图形。每个多级模型由一个较小的种子图(例如,50个节点)组成,该种子图可以从多个模型中创建(例如,对于每个可能的边,选择将其包含在概率p中) 种子图生成后,使用另一组模型中的一个模型将该图扩展为更大的图(例如1000个节点) 在这两个阶段中,每个模型都需要不同数量的参数 我想让program_选项根据模型的名称解析不同的可能参数 例如,假设我有两个种子图模型:SA有1个参数,SB有2个参数。同样对于扩展部分,我有两个模型:A和B,分别有1个和2个参数。我希望能

我有一个程序,使用不同的多级模型生成图形。每个多级模型由一个较小的种子图(例如,50个节点)组成,该种子图可以从多个模型中创建(例如,对于每个可能的边,选择将其包含在概率p中)

种子图生成后,使用另一组模型中的一个模型将该图扩展为更大的图(例如1000个节点)

在这两个阶段中,每个模型都需要不同数量的参数

我想让program_选项根据模型的名称解析不同的可能参数

例如,假设我有两个种子图模型:SA有1个参数,SB有2个参数。同样对于扩展部分,我有两个模型:A和B,分别有1个和2个参数。我希望能够做到以下几点:

./graph_generator --seed=SA 0.1 --expansion=A 0.2
./graph_generator --seed=SB 0.1 3 --expansion=A 0.2
./graph_generator --seed=SA 0.1 --expansion=B 10 20
./graph_generator --seed=SB 0.1 3 --expansion=B 10 20
并正确解析参数。这可能吗?

通过使用and,您可以实现所需的结果:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/optional.hpp>
#include <boost/program_options.hpp>

// Holds parameters for seed/expansion model
struct Model
{
    std::string type;
    boost::optional<float> param1;
    boost::optional<float> param2;
};

// Called by program_options to parse a set of Model arguments
void validate(boost::any& v, const std::vector<std::string>& values,
              Model*, int)
{
    Model model;
    // Extract tokens from values string vector and populate Model struct.
    if (values.size() == 0)
    {
        throw boost::program_options::validation_error(
            "Invalid model specification");
    }
    model.type = values.at(0); // Should validate for A/B
    if (values.size() >= 2)
        model.param1 = boost::lexical_cast<float>(values.at(1));
    if (values.size() >= 3)
        model.param2 = boost::lexical_cast<float>(values.at(2));

    v = model;
}

int main(int argc, char* argv[])
{
    Model seedModel, expansionModel;

    namespace po = boost::program_options;
    po::options_description options("Generic options");
    options.add_options()
        ("seed",
             po::value<Model>(&seedModel)->multitoken(),
             "seed graph model")
        ("expansion",
             po::value<Model>(&expansionModel)->multitoken(),
             "expansion model")
        ;

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

    std::cout << "Seed type: " << seedModel.type << "\n";
    if (seedModel.param1)
        std::cout << "Seed param1: " << *(seedModel.param1) << "\n";
    if (seedModel.param2)
        std::cout << "Seed param2: " << *(seedModel.param2) << "\n";

    std::cout << "Expansion type: " << expansionModel.type << "\n";
    if (expansionModel.param1)
        std::cout << "Expansion param1: " << *(expansionModel.param1) << "\n";
    if (expansionModel.param2)
        std::cout << "Expansion param2: " << *(expansionModel.param2) << "\n";

    return 0;
}
#包括
#包括
#包括
#包括
//保存种子/扩展模型的参数
结构模型
{
std::字符串类型;
boost::可选参数1;
boost::可选参数2;
};
//由程序调用,以解析一组模型参数
无效验证(boost::any&v、const std::vector&value、,
型号*,int)
{
模型;
//从值字符串向量中提取标记并填充模型结构。
if(values.size()==0)
{
抛出boost::程序\选项::验证\错误(
“无效的型号规格”);
}
model.type=values.at(0);//应为A/B进行验证
如果(values.size()>=2)
model.param1=boost::词法转换(value.at(1));
如果(values.size()>=3)
model.param2=boost::词法转换(value.at(2));
v=模型;
}
int main(int argc,char*argv[])
{
模型种子模型、扩展模型;
名称空间po=boost::program\u选项;
po::选项\描述选项(“通用选项”);
选项。添加选项()
(“种子”,
po::value(&seedModel)->multitoken(),
“种子图模型”)
(“扩展”,
po::value(&expansionModel)->multitoken(),
“扩展模型”)
;
变量映射虚拟机;
po::store(po::parse_命令行(argc、argv、options),vm);
po::通知(vm);
标准::cout