我正在浏览一些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&)
);
答案 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:
config
和wm
<code>
:)答案 1 :(得分:1)
第一种情况,它是私有继承。 DemoServerConfiguration
派生自mir::DefaultServerConfiguration
,其中mir可能是命名空间(但也可以是声明内部类DefaultServerConfiguration
的类。
第二种情况,您正在查看lambda表达式定义。您可以阅读一些介绍here。
最后,初始化列表实际上是C ++ 11标准中引入的另一个特性(大多数编译器尚未支持,AFAIK)。关于它们的一些介绍here。
答案 2 :(得分:0)
mir::DefaultServerConfiguration
此处mir
可以是namespace
或class
,其中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
函数模板。
希望有所帮助。