0

コマンドラインインタープリターを書いていて、個々のコマンドのフォーマットをセットアップしようとしています。コマンドの名前、パラメーターの最大量、パラメーターの最小量などがあります。パラメータがどのようなタイプであるかの一種のコレクション、一種のプロトタイプが必要です。私が最初に考えたのは、ジェネリックなしでベクターを宣言することだけでしたが、その後、これは Java ではないことに気付きました。

「read test.dat 2」などのコマンドがあるとします。典型的な読み取りコマンドには文字列と整数があることを示す構造が必要です。

何か案は?

4

3 に答える 3

2

あなたが何を求めているのかはっきりしていないので、私はこれを誤解しているかもしれません。

あなたの説明から、コマンドの抽象的な概念を持っているかのように聞こえます。それらには、パラメーターに関して名前と予想される構造があります。あなたの説明から、タイプ識別子のリストと、それらがオプションかどうかの表示が必要なように思えます。

次に、使用するコマンドごとにコマンド オブジェクトをインスタンス化し、それらすべてをコマンドのコレクションに追加します。

または、マップ コレクションを使用して、コマンド名から実際のコマンド オブジェクトにマップします。各コマンド オブジェクトは、コマンドを実際に実行するためのハンドラ オブジェクトへの参照を保持することもできます。

于 2009-01-27T23:47:50.487 に答える
2

異種コンテナ

固定されたタイプのセットを格納できるコンテナーが必要な場合は、次のいずれかを使用できますboost::variant

typedef boost::variant<std::string, int> optval;
typedef std::vector<optval> options;

これで、文字列または整数のいずれかをベクターに push_back できます。バリアントは、その内容を記録します。

options opts;
opts.push_back(10);
opts.push_back("hello");

バリアントから正しい値を取得する方法など、Boost variantのドキュメントでそれについて読むことができます。もちろん、コマンドライン解析を既にセットアップしており、そのためのライブラリがもう必要ない場合は、引数名からそのようなバリアントへのマップを作成することもできます。

std::map<std::string, optval> map;
map["--max-foo"] = 10;
map["--title"] = "something fun";

コマンドライン解析

プログラムのコマンド ライン引数を解析したい場合は、Boost.Program Optionsライブラリを調べることができます。

getoptただし、ほとんどの場合、コマンドラインも解析できるposix 関数を使用することになります。最初にブースト プログラムのオプションを調べることをお勧めします。重すぎると感じた場合は、getopt を調べることができます (「参考文献」を参照man 3 getopt) 。

于 2009-01-27T23:51:28.500 に答える
1

このようなもの、おそらく:

enum ParameterType
{
  Int,
  String
};

struct Command
{
  string name;
  vector<ParameterType> maxParameters;
  int minParameters;
};
于 2009-01-27T23:54:09.133 に答える