Disons que j'ai un std::any
qui peut ou non contenir un pointeur vers une classe dérivée d'une classe de base donnée. B
. Y a-t-il un moyen de faire quelque chose que :
- Retourne un
B *
si lestd::any
l'objet détient quelque chose de convertible enB *
ou - Lance une exception si ce n'est pas le cas ?
Il semble que dynamic_cast
y std::any_cast
fournissent chacun une moitié de cette fonctionnalité, mais je ne vois aucun moyen de réunir les deux.
Je suis conscient que je peux faire fonctionner cela de différentes manières qui impliquent l'énumération explicite de chaque type convertible en B *
mais c'est la mère de toutes les violations de DRY.
Exemple de cas d'utilisation :
std::vector<std::any> setupTools(const std::string & confFile)
{
std::vector<std::any> myTools;
auto conf = parse(confFile);
for(std::string & wrenchInfo : conf["Wrenches"])
{
Wrench::setup(myTools, wrenchInfo);
}
for(std::string & hammerInfo : conf["Hammers"])
{
Hammer::setup(myTools, hammerInfo);
}
// 25 more kinds of tools
}
Factory1::init(const std::vector<std::any> & tools)
{
m_wrench = any_get<Wrench *>(tools);
m_hammer = any_get<Hammer *>(tools);
m_saw = any_get<Saw *>(tools);
}
Factory2::init(const std::vector<std::any> & tools)
{
m_wrench = any_get<TorqueWrench *>(tools);
}
Factory3::init(const std::vector<std::any> & tools)
{
m_saw = any_get<CordlessReciprocatingSaw *>(tools);
}
Je ne veux pas inclure un tas de code passe-partout listant tous les types de scie existants juste pour pouvoir prendre une scie tout Saw
-- à utiliser dans Factory1
.