C++:在子类中扩展静态 STL 容器/映射成员?
C++: Extending static STL container/ map member in subclass?
目前我的代码看起来很像
#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}}});
相关文章:
- 更改多重映射容器中所有元素的键值
- C++:在子类中扩展静态 STL 容器/映射成员?
- C++ 在集合和映射容器中获取唯一值
- C++映射容器 erase() 分段错误
- 我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么
- 是否可以访问非线程安全容器内指针指向的值(线程安全映射中的条目)?
- 未签名的char数组到stl ::映射或其他容器中的键
- C++11 在列表到映射(或其他容器)之间移动元素
- 从 c++ 映射容器到 matlab
- 使用 QSet 作为 Qt 映射容器中的键
- 具有私有构造函数和自身静态容器(映射)的对象
- 如何制作一个C++映射容器,其中键是值的一部分
- 消除类似映射和类似矢量的容器之间的模板专用化
- Python -> C++ 习语:将 lambda 表达式存储在映射/容器中
- C++ 如何在具有 O(n) 遍历的不同映射容器中区分具有带值的重复键和具有值的唯一键的 Multimap
- 映射类型为的队列容器
- c++映射容器[this]()
- 如何命名同时充当其他集合容器的B+树键/值映射集合
- C++类似于 std::vector / boost::array 的文件内存映射容器
- 使用哪个容器映射或设置或其他