语法澄清

时间:2013-06-20 12:49:49

标签: c++ ubuntu syntax

我正在浏览一些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;
}

为什么多个&lt;&gt; &LT;&GT; &LT;&GT;拼图?为什么the_event_filters()在那里?

最后一块

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

不清楚部分

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

3 个答案:

答案 0 :(得分: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&amp;的参数。 (此参数没有名称,所以看起来它实际上并没有使用它
  • <code>:)

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

mir::DefaultServerConfiguration

此处mir可以是namespaceclass,其中DefaultServerConfiguration已定义。例如,它可能是这样的:

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

或者这个,

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

在这两种情况下,您都可以访问班级DefaultServerConfiguration

mir::DefaultServerConfiguration

其他情况也是如此。

struct DemoServerConfiguration : mir::DefaultServerConfiguration
{

此处DemoServerConfiguration是源自mir::DefaultServerConfiguration的类。有意义吗?

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

希望有所帮助。