C++ 允许使用Boost::program_选项多次出现自定义类型

C++ 允许使用Boost::program_选项多次出现自定义类型,c++,boost,boost-program-options,C++,Boost,Boost Program Options,有没有办法允许自定义类型(struct)在boost::program\u options中多次出现?我发现可以使用std::vector实现各种指定这一点的源代码,但我希望使用自定义数据类型实现同样的功能。但是,这个结构包含一个std::vector,我想在其中存储数据。一个代码示例将非常有用 但是,既然您的结构将包含向量,为什么不绑定该向量呢 简单的例子: #include <boost/program_options.hpp> #include <boost/progr

有没有办法允许自定义类型(
struct
)在
boost::program\u options
中多次出现?我发现可以使用
std::vector
实现各种指定这一点的源代码,但我希望使用自定义数据类型实现同样的功能。但是,这个结构包含一个std::vector,我想在其中存储数据。

一个代码示例将非常有用

但是,既然您的结构将包含向量,为什么不绑定该向量呢

简单的例子:

#include <boost/program_options.hpp>
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/cmdline.hpp>
#include <iostream>
#include <vector>

struct my_custom_type {
    std::vector<std::string> values;

    friend std::ostream& operator<<(std::ostream& os, my_custom_type const& mct) {
        std::copy(mct.values.begin(), mct.values.end(), std::ostream_iterator<std::string>(os << "{ ", ", "));
        return os << "}";
    };
};

int main(int argc, char** argv) {
    namespace po = boost::program_options;

    my_custom_type parse_into;

    po::options_description desc;
    desc.add_options()
        ("item", po::value<std::vector<std::string> >(&parse_into.values), "One or more items to be parsed")
        ;

    try {
        po::variables_map vm;
        po::store(po::parse_command_line(argc, argv, desc, po::command_line_style::default_style), vm);
        vm.notify();

        std::cout << "Parsed custom struct: " << parse_into << "\n";
    } catch(std::exception const& e) {
        std::cerr << "Error: " << e.what() << "\n";
    }
}
如果您想以“特殊”的方式“自动”处理转换,您可以查看

  • 自定义验证器()
  • 自定义通知程序(例如,有关简单示例,请参见)

一个代码示例将非常有用

但是,既然您的结构将包含向量,为什么不绑定该向量呢

简单的例子:

#include <boost/program_options.hpp>
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/cmdline.hpp>
#include <iostream>
#include <vector>

struct my_custom_type {
    std::vector<std::string> values;

    friend std::ostream& operator<<(std::ostream& os, my_custom_type const& mct) {
        std::copy(mct.values.begin(), mct.values.end(), std::ostream_iterator<std::string>(os << "{ ", ", "));
        return os << "}";
    };
};

int main(int argc, char** argv) {
    namespace po = boost::program_options;

    my_custom_type parse_into;

    po::options_description desc;
    desc.add_options()
        ("item", po::value<std::vector<std::string> >(&parse_into.values), "One or more items to be parsed")
        ;

    try {
        po::variables_map vm;
        po::store(po::parse_command_line(argc, argv, desc, po::command_line_style::default_style), vm);
        vm.notify();

        std::cout << "Parsed custom struct: " << parse_into << "\n";
    } catch(std::exception const& e) {
        std::cerr << "Error: " << e.what() << "\n";
    }
}
如果您想以“特殊”的方式“自动”处理转换,您可以查看

  • 自定义验证器()
  • 自定义通知程序(例如,有关简单示例,请参见)

非常感谢您提供的代码片段。绑定向量在我的情况下应该会有所帮助。当我们给出诸如
/test--item=a--item=b
之类的输入时,这会起作用吗?。。。对这正是我所做的。。。您看到了实时示例了吗?如果您不知道,
--item={a,b,c}
bash
中的大括号扩展,并扩展到
--item=a--item=b--item=c
非常感谢您提供的代码片段。绑定向量在我的情况下应该会有所帮助。当我们给出诸如
/test--item=a--item=b
之类的输入时,这会起作用吗?。。。对这正是我所做的。。。您看到了活动示例了吗?如果您不知道,
--item={a,b,c}
bash
中是大括号扩展,并扩展到
--item=a--item=b--item=c