C++:在子类中扩展静态 STL 容器/映射成员?

C++: Extending static STL container/ map member in subclass?

本文关键字:容器 映射 成员 STL 静态 子类 扩展 C++      更新时间:2023-10-16

目前我的代码看起来很像

#include <map>
#include <string>
#include <functional>
void SomeFunc();
void SomeOtherFunc();
struct Calls {
std::string name;
std::function<void(void)> a, b;
};
struct BaseClass
{
static const std::map<std::string, Calls> callbacks; 
const std::map<std::string, Calls>* pCallbacks = &callbacks; // Run-time polymorphism, pointers are *typically* upcast back to base class.
};
const std::map<std::string, Calls> BaseClass::callbacks = {{"testX", {"x", SomeFunc, SomeOtherFunc}}};
void MoreFuncs();
void MoreFuncs2();
struct DerivedClass : BaseClass
{
static const std::map<std::string, Calls> callbacks;
const std::map<std::string, Calls>* pCallbacks = &callbacks;
};
const std::map<std::string, Calls> DerivedClass::callbacks = {
{"testX", {"x", SomeFunc, SomeOtherFunc}},
{"testY", {"g", MoreFuncs, MoreFuncs2}}};
struct DeepClass : DerivedClass
{
static const std::map<std::string, Calls> callbacks;
const std::map<std::string, Calls>* pCallbacks = &callbacks;
};
const std::map<std::string, Calls> DeepClass::callbacks = {
{"testX", {"x", SomeFunc, SomeOtherFunc}},
{"testY", {"g", MoreFuncs, MoreFuncs2}},
{"testZ", {"h", SomeOtherFunc, MoreFuncs2}},
};

体积更大。 在我看来,以这种方式扩展很累,并且留下了太多的视觉集群。有什么技术可以简化此操作吗?

你可以写一个函数,比如

auto concat_maps(std::map<std::string, Calls> first, const std::map<std::string, Calls>& second)
{
first.insert(second.begin(), second.end());
return first;
}

将一张地图合并到另一张地图中。 这允许您将派生类映射定义为父类映射和要添加的元素的串联。 那看起来像

struct DerivedClass : BaseClass
{
static const std::map<std::string, Calls> callbacks;
const std::map<std::string, Calls>* pCallbacks = &callbacks;
};
const std::map<std::string, Calls> DerivedClass::callbacks = 
concat_maps( BaseClass::callbacks, {{"testY", {"g", MoreFuncs, MoreFuncs2}}});
struct DeepClass : DerivedClass
{
static const std::map<std::string, Calls> callbacks;
const std::map<std::string, Calls>* pCallbacks = &callbacks;
};
const std::map<std::string, Calls> DeepClass::callbacks = 
concat_maps( DerivedClass::callbacks, {{"testZ", {"h", SomeOtherFunc, MoreFuncs2}}});