このプログラミング手法とは何ですか? (ブーストライブラリ)

StackOverflow https://stackoverflow.com/questions/809827

  •  03-07-2019
  •  | 
  •  

質問

boostライブラリのprogram_optionsの例を理解しようとしています( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458

特にこの部分:

desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>(), "set compression level")
;

ここで彼は何をしているのですか?それはどのテクニックですか?

この部分desc.add_options()は関数呼び出しである可能性がありますが、他の()はここにどのように適合しますか?これは何らかの演算子のオーバーロードですか?

ありがとう!

役に立ちましたか?

解決

&quot; add_options()&quot;関数は、実際にはファンクター、つまり()演算子をオーバーライドするオブジェクトを返します。つまり、次の関数呼び出し

desc.add_options() ("help", "produce help message");

実際に展開する

desc.add_options().operator()("help", "produce help message");

&quot; operator()&quot;また、ファンクターを返すので、示されているように呼び出しを連鎖できます。

他のヒント

おそらくadd_options()は、「連鎖」をサポートするためにoperator()がオーバーロードされた何らかのファンクターを返します。 (これは非常に便利なテクニックです、ところで)

オーバーロード(...)を使用すると、関数のように動作するクラスを作成できます。

例:

struct func
{
    int operator()(int x)
    {
        cout << x*x << endl;
    }
};

...

func a;
a(5); //should print 25

ただし、operator()がオブジェクトへの参照を返す場合は、「チェーン」できます。演算子。

struct func
{
    func& operator()(int x)
    {
        cout << x*x << endl;
        return *this;
    }
};

...

func a;
a(5)(7)(8); //should print 25 49 64 on separate lines

a(5)はaを返すため、(a(5))(7)は a(5)とほぼ同一です。 a(7);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top