语法澄清

sdr*_*ish 7 c++ syntax ubuntu

我正在浏览一些Ubuntu的Mir示例,我偶然发现了一些我无法理解的代码.

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{
Run Code Online (Sandbox Code Playgroud)

这里发生了什么" :mir :: DefaultServerConfiguration "?

在这个结构里面就是这个

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

同样的故事,我不明白不清楚部分的语法:

<msh::PlacementStrategy> the_shell_placement_strategy()
Run Code Online (Sandbox Code Playgroud)

return shell_placement_strategy(
       [this]
       {
Run Code Online (Sandbox Code Playgroud)

再次在同一个结构内

std::initializer_list<std::shared_ptr<mi::EventFilter> const> the_event_filters() override
{
    return filter_list;
}
Run Code Online (Sandbox Code Playgroud)

为什么多个<> <> <>嵌套?为什么the_event_filters()在那里?

最后一块

mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
    code
});
Run Code Online (Sandbox Code Playgroud)

不清楚的部分

(config, [&config, &wm](mir::DisplayServer&)
);
Run Code Online (Sandbox Code Playgroud)

Spo*_*ook 8

第一个例子

这只是从内部类型继承的情况:

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

class D : public C::Internal
{
    // D derives from Internal class, which is a member of C class
};
Run Code Online (Sandbox Code Playgroud)

::是范围分辨率的运算符.表达A::B意味着:"B,它是A的成员".::适用于类,结构和命名空间.

第二个例子

这有点复杂.

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

让我们把它分解成几部分.

std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
Run Code Online (Sandbox Code Playgroud)

这是一个函数/方法the_shell_placement_strategy,它返回一个类型的结果std::shared_ptr(泛型类参数化msh::PlacementStrategy- 参见前一点).

return shell_placement_strategy(
Run Code Online (Sandbox Code Playgroud)

它返回调用shell_placement_strategy...的结果

   [this]
   {
      return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
   }
Run Code Online (Sandbox Code Playgroud)

...将lambda(无名函数)作为参数.那个无名函数想要访问this(因此[this])并返回调用泛函数的结果std::make_shared,参数化me::FulscreenPlacementStrategy和调用参数是调用the_display()方法/函数的结果.

您可以在其他地方阅读有关lambdas的内容,但我会提供一个简短的解释供参考:

[access-specification](parameters){ body }
Run Code Online (Sandbox Code Playgroud)

哪里:

  • access-specification定义lambda和局部变量之间的关系.例如,[a]表示lambda将按a值访问局部变量; [&a] - 相同,但参考; [&] - lambda将通过引用访问所有局部变量,依此类推.
  • parameters - 定期定义功能参数
  • body - 规则的lambda体.

lambda表示法是C++11标准的一部分.

最后的例子

你现在应该能够解释这个例子:

mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
    code
});
Run Code Online (Sandbox Code Playgroud)

那是:

  • run_mir方法(或函数)的调用,它是mir类(或命名空间)的一部分;
  • 有两个参数:config和一个函数,它接受两个参数;
  • config 作为第一个参数传递;
  • lambda由第二个参数传递.

现在lambda:

  • 它希望通过引用访问两个局部变量:configwm
  • 它接受一个类型为mir :: DisplayServer&的参数(此参数没有名称,所以看起来它实际上并没有使用它
  • 它确实<code>:)