c++ - 语法说明

标签 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;
}

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

最后一 block

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按值(value); [&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> :)

关于c++ - 语法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214075/

相关文章:

c++ - 非变异操作本质上是线程安全的(C++)吗?

c++ - Python 比 C++ 更快更轻吗?

ubuntu - .ctags 文件位于 Ubuntu 中的什么位置?

ubuntu - Ubuntu 16.04 i3wm 设置亮度快捷键

PowerShell 字符串插值语法

C 基础知识 : double variable not equal to double expression?

c - Visual Studio 2010 在尝试调试时给我语法错误,但没有语法错误!

c++ - 是否可以在同一 gdb session 中跨重新运行保留硬件观察点?

c++ - 如何在 C++ 中重复一个字符串可变次数?

php - 通过 Eclipse、Netbeans 或任何其他 IDE 处理远程 PHP 项目(Ubuntu 服务器)