7

I was browsing some of Ubuntu's Mir examples and i stumbled upon code that i couldn't understand.

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{

What is going on here ": mir::DefaultServerConfiguration"?

Inside that struct there's this

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

Same story here, i don't understand the syntax the unclear parts are:

<msh::PlacementStrategy> the_shell_placement_strategy()

and

return shell_placement_strategy(
       [this]
       {

Inside the same struct again

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

Why the multiple <> <> <> nested? Why the the_event_filters() there?

And the last piece

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

Unclear part

(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意思是:“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()方法/函数的结果。

您可能会在其他地方读到有关 lambdas 的信息,但我将包含一个简短的解释以供参考:

[access-specification](parameters){ body }

在哪里:

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

lambda 符号是C++11标准的一部分。

最后一个例子

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

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

那是:

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

现在是 lambda:

  • 它想通过引用访问两个局部变量:configwm
  • 它接受一个 mir::DisplayServer& 类型的参数(这个参数没有名称,所以看起来它实际上并没有使用它
  • 它确实<code>:)
于 2013-06-20T12:50:52.880 回答
1

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

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

最后,初始化列表实际上是 C++11 标准中引入的另一个特性(大多数编译器尚未支持,AFAIK)。这里有一些关于它们的介绍。

于 2013-06-20T12:54:30.847 回答
0
mir::DefaultServerConfiguration

这里mir可以是定义的 anamespaceclass内部DefaultServerConfiguration。例如,它可能是这样的:

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函数模板。

希望有帮助。

于 2013-06-20T12:54:39.967 回答