我在浏览 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:
- 它想通过引用访问两个局部变量:
config
和wm
- 它接受一个类型为 mir::DisplayServer& 的参数(这个参数没有名称,看起来它实际上并没有使用它
- 确实如此
<code>
:)
关于c++ - 语法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214075/