【问题标题】:C++: Extending static STL container/ map member in subclass?C++:在子类中扩展静态 STL 容器/映射成员?
【发布时间】:2020-06-03 21:09:49
【问题描述】:

目前我的代码看起来很像

#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}},
};

体积更大。 以这种方式扩展很累,并且在我看来会留下太多的视觉集群。有什么技术可以让这更容易吗?

【问题讨论】:

    标签: c++ oop inheritance stl


    【解决方案1】:

    你可以写一个类似的函数

    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}}});
    

    【讨论】:

    • 在那种情况下,有没有办法自动填写第一个参数/把它变成我可以复制的东西?
    • @Atherix 你熟悉宏吗?
    • 是的,但我不太确定如何在这里应用它。没有宏或任何东西来获取“当前类”的基类,或者有什么东西吗? @NathanOliver
    • @atherix 没有,但是您可以在您的类中定义一个类型别名,称为 parent,它是基本类型的别名。然后你的宏就可以使用它了。
    • 是的,我想这实际上可能是我最好的选择。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2011-10-21
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多