質問
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);
。
所属していません StackOverflow