在Apollo中datacenter类在那个代码块中会被传参
时间: 2024-02-03 11:13:46 浏览: 73
在Apollo中,datacenter类在以下代码块中会被传参:
```cpp
namespace apollo {
namespace cyber {
namespace common {
class GlobalData {
public:
template <typename T>
static T* GetMutableGlobalData() {
static T* data = nullptr;
if (data == nullptr) {
std::lock_guard<std::mutex> lock(mutex_);
if (data == nullptr) {
data = new T;
DataPtrVec<T>* new_data_vec = new DataPtrVec<T>();
new_data_vec->push_back(data);
data_map_[typeid(T).hash_code()] = new_data_vec;
}
}
return data;
}
template <typename T>
static T* GetGlobalData() {
auto data_vec = DataMap<T>();
if (data_vec->empty()) {
return nullptr;
}
return data_vec->back();
}
template <typename T>
static bool Has() {
auto data_vec = DataMap<T>();
return !data_vec->empty();
}
template <typename T>
static void Clear() {
auto data_vec = DataMap<T>();
for (auto& data : *data_vec) {
delete data;
}
data_vec->clear();
}
private:
GlobalData() {}
~GlobalData() {}
template <typename T>
using DataPtrVec = std::vector<T*>;
template <typename T>
static DataPtrVec<T>* DataMap() {
auto it = data_map_.find(typeid(T).hash_code());
if (it == data_map_.end()) {
return nullptr;
}
return static_cast<DataPtrVec<T>*>(it->second);
}
static std::mutex mutex_;
static std::unordered_map<size_t, void*> data_map_;
};
} // namespace common
} // namespace cyber
} // namespace apollo
```
在该代码块中,datacenter类使用了模板函数的形式,可以传入任意类型的参数,并且在GetMutableGlobalData()函数中被创建和初始化。DataPtrVec<T>类型的变量new_data_vec用于存储data指针,再将new_data_vec存入data_map_中,以便后续调用。在GetGlobalData()函数中,通过DataMap<T>()函数获取存储data指针的vector,并返回其最后一个指针,即为datacenter对象。在Has()函数中,通过DataMap<T>()函数查找是否有datacenter对象。在Clear()函数中,通过DataMap<T>()函数获取所有存储data指针的vector,并逐个删除。
阅读全文