CARLA
 
载入中...
搜索中...
未找到
Functional.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6#pragma once // 防止头文件被多次包含,确保每个源文件只包含一次此头文件
7
8#include <utility> // 包含标准库中的实用工具头文件,用于完美转发等特性
9
10namespace carla {
11
12 // Functional 类定义,提供创建特殊调用对象的静态方法
13 class Functional {
14 public:
15
16 /// 创建一个递归调用对象
17 ///
18 /// 该函数模板接受一个可调用对象(FuncT 类型),并返回一个递归调用对象。
19 /// 递归调用对象将自身作为第一个参数传递给传入的可调用对象(func),
20 /// 从而允许实现递归逻辑而无需显式传递函数指针或对象。
21 ///
22 /// @param func 传入的可调用对象,它接受一个与自身类型相同的参数(递归调用时提供)。
23 /// @return 返回一个递归调用对象,该对象可以调用原始的可调用对象,并传递自身作为参数。
24 ///
25 /// 用法示例:可以创建递归 lambda 表达式。
26 template <typename FuncT>
27 static auto MakeRecursive(FuncT &&func) {
28 return Recursive<FuncT>(std::forward<FuncT>(func));
29 }
30
31 /// 创建一个重载调用对象
32 ///
33 /// 该函数模板接受一个或多个可调用对象(FuncTs... 类型),
34 /// 并返回一个重载调用对象。重载调用对象将贡献一个或多个 operator() 的重载,
35 /// 每个重载对应一个传入的可调用对象。
36 ///
37 /// @param fs 传入的一个或多个可调用对象,它们将贡献 operator() 的重载。
38 /// @return 返回一个重载调用对象,该对象可以根据参数类型或数量调用相应的可调用对象。
39 ///
40 /// 用例:可以将多个 lambda 表达式组合成一个具有多个重载的 lambda。
41 template <typename... FuncTs>
42 static auto MakeOverload(FuncTs &&... fs) {
43 return Overload<FuncTs...>(std::forward<FuncTs>(fs)...);
44 }
45
46 /// 创建递归重载调用对象
47 ///
48 /// 该函数模板结合了 MakeRecursive 和 MakeOverload 的功能,
49 /// 接受一个或多个可调用对象,并返回一个递归重载调用对象。
50 /// 递归重载调用对象既支持递归调用,又支持根据参数类型或数量选择重载。
51 ///
52 /// @param fs 传入的一个或多个可调用对象,它们将组合成递归重载调用对象。
53 /// @return 返回一个递归重载调用对象,该对象结合了递归和重载的特性。
54 ///
55 /// @see MakeRecursive 和 MakeOverload,了解如何分别创建递归调用对象和重载调用对象。
56 template <typename... FuncTs>
57 static auto MakeRecursiveOverload(FuncTs &&... fs) {
58 return MakeRecursive(MakeOverload(std::forward<FuncTs>(fs)...));
59 }
60
61 }; // Functional 类结束
62
63} // carla 命名空间结束
64 private:
65
66 // 声明一个模板结构体 Overload,用于组合多个可调用对象
67 template <typename... Ts>
68 struct Overload;
69
70 // 处理多个可调用对象的情况,递归继承 Overload
71 template <typename T, typename... Ts>
72 struct Overload<T, Ts...> : T, Overload<Ts...> {
73 // 构造函数,初始化 T 和其余的 Overload 基类
74 Overload(T &&func, Ts &&... rest)
75 : T(std::forward<T>(func)),// 初始化基类 T
76 Overload<Ts...>(std::forward<Ts>(rest)...) {}
77
78 using T::operator();
79
80 using Overload<Ts...>::operator();
81 };
82
83 template <typename T>
84 struct Overload<T> : T { // 基本情况,只处理一个可调用对象
85 Overload(T &&func) : T(std::forward<T>(func)) {} // 初始化基类 T
86
87 using T::operator(); // 继承 T 的 operator()
88 };
89
90 template<typename T>
91 struct Recursive { // 定义 Recursive 结构体,用于递归调用
92
93 explicit Recursive(T &&func) : _func(std::forward<T>(func)) {} // 构造函数,初始化 _func
94
95 template<typename... Ts> // 重载 operator() 实现递归调用
96 auto operator()(Ts &&... arguments) const { // 将自身 (*this) 作为第一个参数传递给 _func,实现递归
97 return _func(*this, std::forward<Ts>(arguments)...);
98 }
99
100 private:
101
103 };
104
105 };
106
107} // namespace carla
static auto MakeRecursive(FuncT &&func)
创建一个递归调用对象
Definition Functional.h:27
static auto MakeOverload(FuncTs &&... fs)
创建一个重载调用对象
Definition Functional.h:42
static auto MakeRecursiveOverload(FuncTs &&... fs)
创建递归重载调用对象
Definition Functional.h:57
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
Overload(T &&func, Ts &&... rest)
Definition Functional.h:74
Overload(T &&func)
Definition Functional.h:85
Recursive(T &&func)
Definition Functional.h:93
auto operator()(Ts &&... arguments) const
Definition Functional.h:96