0

我正在实现一个涉及大量操作和参数的命令模式实现。为了简化,我计划使用可以将所有可能的参数保存到地图中的模块的类。

class ParamBag {
public:
    add(int paramId, shared_ptr<IParam> param);
    bool contains(int paramId);
    std::shared_ptr<IParam> get(paramId);

private:
    int mask;
    std::map<int, std::shared_ptr<IParam>> params;
};

这种实现的一个明显缺点是每个参数都必须从 IParam 接口扩展,我可以以某种方式简化它。

4

1 回答 1

0

如果在 get 之后使用参数的那个知道参数的类型,那么你可以使用 c++17 std::any,或者如果你必须使用 c++11 你可以尝试boost::any,或者如果没有一个你可以求助于void*.

不同之处在于 void* 在转换为错误类型时不会失败,any_cast如果与指针一起使用,则会抛出异常或返回 nullptr。您还需要在 std::shared_ptr 中使用自定义删除器才能释放 void*。

于 2018-10-12T07:03:14.330 回答