提升program_options:在 3D 矢量中读取作为命令行参数

boost program_options: Read in 3d Vector as Command Line Parameter

本文关键字:读取 参数 命令行 program options 3D 提升      更新时间:2023-10-16

我有

boost::program_options::options_description desc("Required options");                                             
desc.add_options()(                                                                                                                
  detail::enu_orig_lat_opt,                                               
  boost::program_options::value<float>(),                                 
  "Origin of enu latitudinal coordinates."                                                                        
)(                                                                                                                
  detail::enu_orig_lng_opt,                                               
  boost::program_options::value<float>(),                                 
  "Origin of enu longitudinal coordinates."                                                                       
)(                                                                                                                
  detail::enu_orig_alt_opt,                                               
  boost::program_options::value<float>(),                                 
  "Origin of enu altitude coordinates."                                                                       
);

我可以使用具有multitoken值的单个选项,并将其类型为std::vector<float>,或者我可以使用具有三个字段的结构并使用该类型的值。到目前为止,我一直在为这两种选择而苦苦挣扎,并且无法让它们发挥作用。上述选项(请参阅代码)的问题在于,如果用户只指定其中一个值,我必须添加代码来验证其他值的存在。

所以我在这里真的有两个问题。第一,有没有人有读取 3d 矢量的示例代码,包括负浮点数作为命令行选项?或者两个(如果不是),如果设置了一个或多个选项,那么确保指定三个相关选项的理想方法是什么?

关于验证选项组的主题,请参阅以下相关答案: C ++/boost program_options一个选项禁用其他选项

最简单的方法是使矢量类型可流:

活在魔杖盒上

#include <iosfwd>
#include <istream>
template <typename T> struct LLA { 
    T lat, lon, alt;
    friend std::istream& operator>>(std::istream& is, LLA& lla) {
        char ch;
        if (is >> lla.lat >> ch && ch == ';'
         && is >> lla.lon >> ch && ch == ';'
         && is >> lla.alt)
            return is;
        is.setstate(std::ios::failbit);
        return is;
    }
};
using Origin = LLA<float>;
#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;
int main(int argc, char** argv) {
    Origin origin;
    po::options_description desc;
    desc.add_options()
        ("origin,o", po::value(&origin), "origin of enu (lat;lon;alt)")
        ;
    auto parsed = po::parse_command_line(argc, argv, desc, po::command_line_style::default_style);
    po::variables_map vm;
    po::store(parsed, vm);
    po::notify(vm);
    std::cout << "Origin: lat:" << origin.lat << " lon:" << origin.lon << " alt:" << origin.alt << "n";
}

将打印例如

Origin: lat:3 lon:-5 alt:7

当调用时,例如

./test --origin='3;-5;7'
./test --origin '3;-5;7'
./test -0 '3;-5;7'