我有一个资源管理器,就像 Andrei Alexandrescu 在 Modern C++ Design 一书中提出的那样,遵循基于策略的设计。不过我遇到了麻烦,因为我的资源管理器需要能够通过shared_from_this()
.
我构建了一个重现我的问题的最小示例,您可以在此处看到结果。
基本上我有一些托管资源需要引用其管理器:
template <typename T>
class managed_resource
{
typedef std::shared_ptr<manager<T>> manager_ptr;
public:
managed_resource(manager_ptr const & parent)
: parent_(parent)
{
}
/* ... */
private:
manager_ptr parent_;
};
以及存储和提供资源的经理:
template <typename Policy>
class manager
: Policy
, std::enable_shared_from_this<manager<Policy>>
{
typedef managed_resource<Policy> resource;
typedef std::shared_ptr<resource> resource_ptr;
public:
resource_ptr get_resource(std::string const & name)
{
Policy & p = *this;
if(p.find(name))
{
return p.get(name);
}
resource_ptr res = std::make_shared<resource>(shared_from_this());
p.store(name, res);
return res;
}
};
如您所见,存储本身是基于策略的。虽然经理确实创建了资源,但策略可以在存储信息的各种方法之间自由决定(例如,它可以选择不存储任何内容并每次都创建新资源)。
这是存储策略的示例:
class map_policy
{
typedef std::shared_ptr<managed_resource<map_policy>> resource_ptr;
typedef std::map<std::string, resource_ptr> resources;
public:
bool find(std::string const & name)
{
resources::iterator res_it = resources_.find(name);
return res_it != resources_.end();
}
resource_ptr get(std::string const & name)
{
resources::iterator res_it = resources_.find(name);
return res_it->second;
}
void store(std::string const & name, resource_ptr const & res)
{
resources_[name] = res;
}
private:
resources resources_;
};
但我得到一个编译错误:
error: there are no arguments to ‘shared_from_this’ that depend
on a template parameter, so a declaration of
‘shared_from_this’ must be available
error: ‘std::enable_shared_from_this<manager<map_policy> >’ is
an inaccessible base of ‘manager<map_policy>’
有关完整的编译输出,请参见最小示例。
是否不可能在基于策略的设计中使用std::enable_shared_from_this
和使用?shared_from_this()
如果没有,正确的使用方法是什么?