J'ai un gestionnaire de ressources qui, comme Andrei Alexandrescu l'a proposé dans le livre Modern C++ Design, suit une conception basée sur des politiques. Cependant, j'ai des problèmes, car mon gestionnaire de ressources doit être capable de fournir des références à lui-même aux ressources gérées par shared_from_this()
.
J'ai construit un exemple minimal reproduisant mon problème, dont vous pouvez voir les résultats ici.
Fondamentalement, j'ai des ressources gérées qui ont besoin d'une référence à leur gestionnaire:
template
class managed_resource
{
typedef std::shared_ptr> manager_ptr;
public:
managed_resource(manager_ptr const & parent)
: parent_(parent)
{
}
/* ... */
private:
manager_ptr parent_;
};
Et un gestionnaire qui stocke et fournit des ressources:
template
class manager
: Policy
, std::enable_shared_from_this>
{
typedef managed_resource resource;
typedef std::shared_ptr 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(shared_from_this());
p.store(name, res);
return res;
}
};
Comme vous pouvez le voir, le stockage lui-même est basé sur des politiques. Alors que le gestionnaire crée les ressources, la politique peut librement décider entre différentes approches de stockage de l'information (elle pourrait par exemple choisir de ne rien stocker et de créer de nouvelles ressources à chaque fois).
Voici un exemple d'une politique de stockage:
class map_policy
{
typedef std::shared_ptr> resource_ptr;
typedef std::map 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_;
};
Mais je reçois une erreur de compilation:
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 >’ is
an inaccessible base of ‘manager’
Pour obtenir la sortie complète de la compilation, voir l'exemple minimal ici.
Est-il impossible d'utiliser std::enable_shared_from_this
et shared_from_this()
dans une conception basée sur des politiques? Si non, quelle est la manière appropriée de l'utiliser?