gpt4 book ai didi

c++ - 避免枚举作为接口(interface)标识符 C++ OOP

转载 作者:太空狗 更新时间:2023-10-29 23:10:04 33 4
gpt4 key购买 nike

我正在开发一个插件框架,该框架使用基于 Eclipse(可能还有其他)扩展点模型的动态加载共享库。所有插件共享相似的属性(名称、ID、版本等),理论上每个插件都可以满足任何扩展点。实际的插件(即 Dll)处理由另一个库管理,我所做的只是管理应用程序的接口(interface)集合。

我开始使用 enum PluginType来区分不同的接口(interface),但我很快意识到使用模板函数可以使代码更清晰,并将繁重的工作留给编译器,而不是强制我使用大量的 switch {...}声明。

唯一的问题是我需要为类成员指定类似的功能——最明显的例子是提供特定接口(interface)的默认插件。 Settings类处理所有设置,包括接口(interface)的默认插件。

Skin newSkin = settings.GetDefault<ISkin>();

如何存储默认值 ISkin在容器中而不诉诸于其他一些识别接口(interface)的方法?

正如我上面提到的,我目前使用 std::map<PluginType, IPlugin> Settings::defaults成员来实现这个(其中 IPlugin 是一个抽象基类,所有插件都派生自它。然后我可以 dynamic_cast 在需要时转到所需的接口(interface),但这对我来说确实是糟糕的设计,而且我认为弊大于利.

欢迎任何提示

编辑:这是当前使用默认插件的示例

typedef boost::shared_ptr<ISkin> Skin;
typedef boost::shared_ptr<IPlugin> Plugin;
enum PluginType
{
skin,
...,
...
}

class Settings
{
public:
void SetDefault(const PluginType type, boost::shared_ptr<IPlugin> plugin) {
m_default[type] = plugin;
}
boost::shared_ptr<IPlugin> GetDefault(const PluginType type) {
return m_default[type];
}
private:
std::map<PluginType, boost::shared_ptr<IPlugin> m_default;
};

SkinManager::Initialize()
{
Plugin thedefault = g_settings.GetDefault(skinplugin);
Skin defaultskin = boost::dynamic_pointer_cast<ISkin>(theskin);
defaultskin->Initialize();
}

我宁愿像下面这样调用 getdefault,自动转换为派生类。但是,我需要专门针对每种类(class)类型。

template<>
Skin Settings::GetDefault<ISkin>()
{
return boost::dynamic_pointer_cast<ISkin>(m_default(skin));
}

最佳答案

您可以改用 boost::variant 的序列容器(未经测试的说明性代码):

tyepdef boost::variant<
boost::shared_ptr<ISkin>,
boost::shared_ptr<IPluginType2>,
boost::shared_ptr<IPluginType3>,
etc...> default_t;
std::deque<default_t> defaults;

然后:

template <class T>
boost::shared_ptr<T> GetDefault() {
for(std::deque<default_t>::iterator it = defaults.begin(), endIt = defaults.end();
it != endIt;
++it) {
boost::shared_ptr<T>* result = boost::get< boost::shared_ptr<T> >(*it);
if( result ) {
return *result;
}
}
return boost::shared_ptr<T>(0);
}

关于c++ - 避免枚举作为接口(interface)标识符 C++ OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515922/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com