7

Ubuntu の Mir の例をいくつか閲覧していたところ、理解できないコードに出くわしました。

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{

" : mir::DefaultServerConfiguration "で何が起こっているのでしょうか?

その構造体の中にこれがあります

std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
{
   return shell_placement_strategy(
   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   });
}

ここでも同じ話ですが、構文がわかりません。不明な部分は次のとおりです。

<msh::PlacementStrategy> the_shell_placement_strategy()

return shell_placement_strategy(
       [this]
       {

再び同じ構造体の内部

std::initializer_list<std::shared_ptr<mi::EventFilter> const> the_event_filters() override
{
    return filter_list;
}

複数の <> <> <> が入れ子になっているのはなぜですか? なぜ the_event_filters() があるのですか?

そして最後の一枚

mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
    code
});

不明な部分

(config, [&config, &wm](mir::DisplayServer&)
);
4

3 に答える 3

8

最初の例

これは単純に内部型から継承する場合です:

class C
{
public:
    class Internal
    {
    };
};

class D : public C::Internal
{
    // D derives from Internal class, which is a member of C class
};

::スコープ解決の演算子です。この表現A::Bは、「A のメンバーである B」を意味します。::クラス、構造、および名前空間に対して機能します。

2 番目の例

それはもう少し複雑です。

std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
{
   return shell_placement_strategy(
   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   });
}

パーツに分解してみましょう。

std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()

これは関数/メソッドthe_shell_placement_strategyであり、タイプの結果を返しますstd::shared_ptr(パラメータ化されたジェネリック クラスmsh::PlacementStrategy- 前のポイントを参照)。

return shell_placement_strategy(

shell_placement_strategy...を呼び出した結果を返します

   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   }

...パラメータとしてラムダ(名前のない関数)を取ります。thisその名前のない関数は(したがって)にアクセスしたいと考えており、メソッド/関数の呼び出しの結果であるパラメータでパラメータ化され、呼び出さ[this]れたジェネリック関数への呼び出しの結果を返します。std::make_sharedme::FulscreenPlacementStrategythe_display()

ラムダについては他の場所で読むことができますが、参考のために簡単な説明を含めます。

[access-specification](parameters){ body }

どこ:

  • access-specificationラムダとローカル変数の間の関係を定義します。たとえば、[a]ラムダが値によってローカル変数にアクセスできることを意味aします。[&a]- 同じですが、参考までに。[&]-ラムダは、参照などによってすべてのローカル変数にアクセスできます。
  • parameters- 関数パラメータの通常の定義
  • body- ラムダの通常の本体。

ラムダ表記はC++11標準の一部です。

最後の例

これで、この例を解釈できるはずです。

mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
    code
});

それは:

  • クラス (または名前空間)run_mirの一部であるメソッド (または関数)への呼び出し。mir
  • 2 つのパラメーターを使用:configおよび 2 つのパラメーターを受け入れる関数。
  • config最初のパラメーターとして渡されます。
  • ラムダは、2 番目のパラメーターによって渡されます。

今ラムダ:

  • 参照によって 2 つのローカル変数にアクセスする必要がconfigあります。wm
  • mir::DisplayServer& 型のパラメーターを 1 つ受け入れます (このパラメーターには名前がないため、実際には使用しないようです)
  • それは<code>:)
于 2013-06-20T12:50:52.880 に答える