引用全局变量的模板函数(取决于类型)
Template Functions Referring to Globals (Depending on Type)
对于代码库中的许多类,我需要维护一个全局映射,以便查找该类的实例。例子:
// In ExampleClass.h
ExampleClass *getExampleClass(std::string name);
std::unordered_map<std::string, ExampleClass *> &getAllExampleClasses();
bool addExampleClass(std::string name, ExampleClass *e);
// In ExampleClass.cpp
std::unordered_map<std::string, ExampleClass *> exampleClasses;
ExampleClass *getExampleClass(std::string name) {
return exampleClasses.find(name) == exampleClasses.end() ? nullptr : exampleClasses.find(name)->second;
}
std::unordered_map<std::string, ExampleClass *> &getAllExampleClasses() {
return &exampleClasses;
}
bool addExampleClass(std::string name, ExampleClass *e) {
if (exampleClasses.find(name) == exampleClasses.end()) {
exampleClasses[name] = e;
return true;
}
else
return false;
}
在这样做了几个类之后,我决定把所有这些全局变量和方法放在global.cpp/h中,并使用模板函数。
template <class T> T *get(std::string name);
template <class T> std::unordered_map<std::string, T *> &getAll();
template <class T> bool add(std::string name, T *);
是否有一种方法在模板函数定义中指定要根据类型查找的全局映射?所以get("name")将知道检查exampleclass映射?
你的问题有两个问题,我回答第一个。您可能想要的是将所有函数分组为单个类模板中的static
。请注意,您的函数的实现非常低效,因此我也为您修复了这个问题:
template <typename T>
using RegistryMap = std::unordered_map<std::string, T*>;
template <typename T>
class Registry {
static RegistryMap<T> registry;
public:
static T* get(const std::string& name) {
auto it = registry.find(name);
return it == registry.end() ? nullptr : it->second;
}
static const RegistryMap<T>& getAll() {
return registry;
}
static bool add(const std::string& name, T* object) {
T*& store = registry[name];
if (store) {
return false;
}
else {
store = object;
return true;
}
}
};
template <typename T>
RegistryMap<T> Registry<T>::registry;
对于你原来的例子,你可以这样写:
Registry<Example>::get("name", &some_example);
相关文章:
- SFINAE是否取决于类型推断?
- 将强制转换简化为取决于参数的类型
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 编译时函数的选择取决于类型大小
- memcpy是否取决于源指针和目标指针的类型
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 执行特定函数取决于类型
- 模板函数,其中模板参数类型取决于函数参数
- clang 拒绝具有尾随 decltype 返回类型的模板调用是否正确,具体取决于其重载之一?
- 具有尾随返回类型的通用 lambda,具体取决于 C++11 中的可变参数
- 基类数据成员类型取决于派生类
- 类型取决于模板中的条件
- ExprTK 未知变量分辨率取决于表达式类型
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- C++调用具有不同签名的函数,具体取决于类型
- 通用 cout,可以是 wcout,具体取决于类型定义
- 模板函数实现中的条件,具体取决于类型是否为指针
- 不同的值取决于c++类型
- 模板函数中的默认参数值,取决于类型
- 引用全局变量的模板函数(取决于类型)