我正在浏览一些Ubuntu的Mir示例,我偶然发现了一些我无法理解的代码.
struct DemoServerConfiguration : mir::DefaultServerConfiguration
{
Run Code Online (Sandbox Code Playgroud)
这里发生了什么" :mir :: DefaultServerConfiguration "?
在这个结构里面就是这个
std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
{
return shell_placement_strategy(
[this]
{
return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
});
}
Run Code Online (Sandbox Code Playgroud)
同样的故事,我不明白不清楚部分的语法:
<msh::PlacementStrategy> the_shell_placement_strategy()
Run Code Online (Sandbox Code Playgroud)
和
return shell_placement_strategy(
[this]
{
Run Code Online (Sandbox Code Playgroud)
再次在同一个结构内
std::initializer_list<std::shared_ptr<mi::EventFilter> const> the_event_filters() override
{
return filter_list;
}
Run Code Online (Sandbox Code Playgroud)
为什么多个<> <> <>嵌套?为什么the_event_filters()在那里?
最后一块
mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
code
});
Run Code Online (Sandbox Code Playgroud)
不清楚的部分
(config, [&config, &wm](mir::DisplayServer&)
);
Run Code Online (Sandbox Code Playgroud)
这只是从内部类型继承的情况:
class C
{
public:
class Internal
{
};
};
class D : public C::Internal
{
// D derives from Internal class, which is a member of C class
};
Run Code Online (Sandbox Code Playgroud)
它::是范围分辨率的运算符.表达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());
});
}
Run Code Online (Sandbox Code Playgroud)
让我们把它分解成几部分.
std::shared_ptr<msh::PlacementStrategy> the_shell_placement_strategy()
Run Code Online (Sandbox Code Playgroud)
这是一个函数/方法the_shell_placement_strategy,它返回一个类型的结果std::shared_ptr(泛型类参数化msh::PlacementStrategy- 参见前一点).
return shell_placement_strategy(
Run Code Online (Sandbox Code Playgroud)
它返回调用shell_placement_strategy...的结果
[this]
{
return std::make_shared<me::FullscreenPlacementStrategy>(the_display());
}
Run Code Online (Sandbox Code Playgroud)
...将lambda(无名函数)作为参数.那个无名函数想要访问this(因此[this])并返回调用泛函数的结果std::make_shared,参数化me::FulscreenPlacementStrategy和调用参数是调用the_display()方法/函数的结果.
您可以在其他地方阅读有关lambdas的内容,但我会提供一个简短的解释供参考:
[access-specification](parameters){ body }
Run Code Online (Sandbox Code Playgroud)
哪里:
access-specification定义lambda和局部变量之间的关系.例如,[a]表示lambda将按a值访问局部变量; [&a] - 相同,但参考; [&] - lambda将通过引用访问所有局部变量,依此类推.parameters - 定期定义功能参数body - 规则的lambda体.lambda表示法是C++11标准的一部分.
你现在应该能够解释这个例子:
mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
code
});
Run Code Online (Sandbox Code Playgroud)
那是:
run_mir方法(或函数)的调用,它是mir类(或命名空间)的一部分;config和一个函数,它接受两个参数;config 作为第一个参数传递;现在lambda:
config和wm<code>:)