1

そのため、コードにオプションサポートを追加し始めました。自分で行うことも、ブーストのプログラムオプションを使用することもできます。Boostを使用することを妨げているのは、プロジェクトに追加しているもう1つの依存関係だけです。ただし、複雑なオブジェクトの解析を簡単に処理できるのであれば、私はもっと喜んで代償を払います。

例に基づいてこのようなことを試しましたが、機能しません。

#include <boost/program_options.hpp>
namespace po = boost::program_options;


#include <iostream>
#include <fstream>
#include <iterator>
using namespace std;


struct Grid{
    double xmin, xmax;
};

int main(int ac, char* av[])
{
    try {
        Grid g;

        po::options_description cmd("Allowed options");
        cmd.add_options()
            ("help", "produce help message")
            ("Grid", "grid information")
            ;

        po::variables_map vm;
        store(parse_command_line(ac, av, cmd), vm);
        notify(vm);

        if (vm.count("help")) {
            cout << cmd << "\n";
            return 0;
        }

        g = vm["Grid"].as<Grid>();
        cout << g.xmin << " " << g.xmax << endl;

    }
    catch(exception& e)
    {
        cout << e.what() << "\n";
        return 1;
    }    
return 0;

を使用してコードを実行すると./a.out --Grid {-1, 1}、が取得されboost::bad_any_cast: failed conversion using boost::any_castます。それが何を意味するのかわかりませんが、オブジェクトタイプのブーストを正しく伝えることができないと思いますGrid。ブーストでこれを正しく行うにはどうすればよいですか?

4

1 に答える 1

4

まず、簡単な方法は を使用するpo::value<std::vector<double>>()->multitoken(),ことですが、次のように引数を渡す必要があります。--Grid -1 1

int main(int ac, char* av[])
{
    try {

        po::options_description cmd("Allowed options");
        cmd.add_options()
            ("help", "produce help message")
            ("Grid", po::value<std::vector<double>>()->multitoken(),
             "grid information")
            ;
        po::variables_map vm;
        store(parse_command_line(ac, av, cmd), vm);
        notify(vm);

        if (vm.count("help")) {
            cout << cmd << "\n";
            return 0;
        }

        Grid g{vm["Grid"].as<std::vector<double>>()[0],
               vm["Grid"].as<std::vector<double>>()[1]};
        cout << g.xmin << " " << g.xmax << endl;

    }
    catch(exception& e)
    {
        cout << e.what() << "\n";
        return 1;
    }
}

のような引数を渡したい場合--Grid {-1,1}は、 a を追加して自分自身operator>>を解析できます。std::string

std::istream& operator>>(std::istream &in, Grid &g)
{
    // Note that this code does not do any error checking, etc.
    // It is made simple on purpose to use as an example
    // A real program would be much more robust than this
    std::string line;
    std::getline(in, line);
    std::stringstream ss(line);
    char bracket, comma;
    double xmin, xmax;
    ss >> bracket >> xmin >> comma >> xmax;
    g = Grid{xmin, xmax};
    return in;
}

//...
Grid g;
try {

//...
cmd.add_options()
   ("help", "produce help message")
   ("Grid", po::value(&g), "grid information")
;
//...

cout << g.xmin << " " << g.xmax << endl;

また、 にはスペース--Grid {-1,1}がないことに注意してください :ではなく. これは、のみが含まれるためです。-1,1-1, 1line{-1,

スペースが必要な場合は、カスタム バリデータ--Grid {-1, 1}を使用してを解析できる例を次に示します。multitoken

// Showing only changes, rest of the code is the same
void validate(boost::any& v, const std::vector<std::string>& val,
              Grid*, double)
{
    std::stringstream ss(val[0]);
    char bracket;
    double xmin, xmax;
    ss >> bracket >> xmin;
    ss.str(val[1]);
    ss >> xmax;
    v = Grid{xmin, xmax};
}

po::options_description cmd("Allowed options");
        cmd.add_options()
        ("help", "produce help message")
        ("Grid", po::value(&g)->multitoken(), "grid information")
        ;
于 2012-09-27T00:09:53.053 に答える