草庐IT

c++ - 语法说明

coder 2023-11-17 原文

我在浏览 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++ - 语法说明的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  5. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  6. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  9. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  10. ruby -::在 Ruby 语法中是什么意思? - 2

    这个问题在这里已经有了答案:WhatisRuby'sdouble-colon`::`?(12个答案)关闭8年前。什么是::?@song||=::TwelveDaysSong.new

随机推荐