语法说明

Syntax clarification

本文关键字:说明 语法      更新时间:2023-10-16

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

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{

这是怎么回事": mir::D efaultServerConfiguration"?

在那个结构里面有这个

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&)
);

第一个例子

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

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

::是范围解析的运算符。表达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());
   });
}

让我们把它分成几部分。

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());
   }

。它采用 lambda(无名称函数(作为参数。该无名函数希望能够访问this(因此[this](并返回调用泛型函数std::make_shared的结果,用me::FulscreenPlacementStrategy参数化,并使用参数调用the_display()方法是方法/函数的结果。

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

[access-specification](parameters){ body }

哪里:

  • access-specification定义了 lambda 和局部变量之间的关系。例如,[a]意味着 lambda 将有权按值访问局部变量a; [&a] - 相同,但通过引用; [&] - lambda 将有权通过引用等访问所有局部变量。
  • parameters - 函数参数的常规定义
  • body - λ的常规主体。

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

最后一个例子

您现在应该能够解释此示例:

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

那就是:

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

现在是 lambda:

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

第一种情况是私有继承。 DemoServerConfiguration 派生自 mir::DefaultServerConfiguration,其中 mir 可能是一个命名空间(但也可以是声明内部类 DefaultServerConfiguration 的类。

第二种情况,您正在查看 lambda 表达式定义。你可以在这里阅读一些介绍。

最后,初始值设定项列表实际上是 C++11 标准中引入的另一个功能(大多数编译器 AFAIK 尚不支持(。这里有一些关于它们的介绍。

mir::DefaultServerConfiguration

在这里,mir可以是定义DefaultServerConfigurationnamespaceclass。例如,它可能是这样的:

namespace mir
{
    class DefaultServerConfiguration 
    {
         /*...*/ 
    };
}

或者这个,

class mir
{
 public:
    class DefaultServerConfiguration 
    {
         /*...*/ 
    };
}

在这两种情况下,您都可以按以下方式访问类DefaultServerConfiguration

mir::DefaultServerConfiguration

其他情况也是如此。

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{

这里DemoServerConfiguration是从mir::DefaultServerConfiguration派生的类。有意义?

std::make_shared的情况下,您也注意到了这一点。这里std是由标准库定义的namespace C++库在其中定义make_shared函数模板。

希望有帮助。