语法说明
Syntax clarification
我正在浏览一些Ubuntu的Mir示例,偶然发现了我无法理解的代码。
struct DemoServerConfiguration : mir::DefaultServerConfiguration
{
这是怎么回事": mir::D efaultServerConfiguration"?
在那个结构里面有这个
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((在那里?
最后一块
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
;[&a]
- 相同,但通过引用;[&]
- lambda 将有权通过引用等访问所有局部变量。 -
parameters
- 函数参数的常规定义 -
body
- λ的常规主体。
lambda 表示法是C++11
标准的一部分。
最后一个例子
您现在应该能够解释此示例:
mir::run_mir(config, [&config, &wm](mir::DisplayServer&)
{
code
});
那就是:
- 对
run_mir
方法(或函数(的调用,该方法(或函数(是类(或命名空间(mir
的一部分; - 有两个参数:
config
和一个接受两个参数的函数; -
config
作为第一个参数传递; - lambda 由第二个参数传递。
现在是 lambda:
- 它希望通过引用访问两个局部变量:
config
和wm
- 它接受一个类型为mir::D isplayServer&的参数(这个参数没有名称,所以看起来它实际上并没有使用它 。
- 它确实
<code>
:)
第一种情况是私有继承。 DemoServerConfiguration
派生自 mir::DefaultServerConfiguration
,其中 mir 可能是一个命名空间(但也可以是声明内部类 DefaultServerConfiguration
的类。
第二种情况,您正在查看 lambda 表达式定义。你可以在这里阅读一些介绍。
最后,初始值设定项列表实际上是 C++11 标准中引入的另一个功能(大多数编译器 AFAIK 尚不支持(。这里有一些关于它们的介绍。
mir::DefaultServerConfiguration
在这里,mir
可以是定义DefaultServerConfiguration
的namespace
或class
。例如,它可能是这样的:
namespace mir
{
class DefaultServerConfiguration
{
/*...*/
};
}
或者这个,
class mir
{
public:
class DefaultServerConfiguration
{
/*...*/
};
}
在这两种情况下,您都可以按以下方式访问类DefaultServerConfiguration
:
mir::DefaultServerConfiguration
其他情况也是如此。
struct DemoServerConfiguration : mir::DefaultServerConfiguration
{
这里DemoServerConfiguration
是从mir::DefaultServerConfiguration
派生的类。有意义?
在std::make_shared
的情况下,您也注意到了这一点。这里std
是由标准库定义的namespace
C++库在其中定义make_shared
函数模板。
希望有帮助。
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 当使用通配符和null指针调用函数时,对输出的说明
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 关于C++中具有多重继承"this"指针的说明
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 16 位到 10 位转换代码说明
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 赋值到类型和空大括号. 语法说明
- c++模板语法说明
- 模板语法说明
- C++矩形类关于语法的说明
- 语法说明
- 运算符重载语法说明