c++ - C++:在子类中扩展静态 STL 容器/映射成员?
问题描述
目前我的代码看起来很像
#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}}});
推荐阅读
- reactjs - 为子组件分配 props 的正确方法
- javascript - 图片的动画不起作用!Vue.js
- python - 如何在没有 MemoryError 的情况下将 183,223,040x4 矩阵重塑为 140 个尺寸为 1145x1145 的矩阵?
- javascript - 如何将输入文件参数从 html 页面传递到 Javascript
- c - 数据数组的 mmap 函数
- kubernetes - Kubernetes 中的资源分配:如何调度 Pod?
- javascript - 如何将数组添加到 vue-kanban 块
- java - 云配置收到请求执行错误。来自 Eureka 服务器的 endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8761/}
- node.js - 在我的代码中使用 node-rdkafka 2.5.1 版本连接到 kafka,一段时间后连接崩溃
- redis - 如何在 Spring Boot 应用程序中使用 Redis 作为会话进行身份验证