J'essaie d'implémenter un modèle composite pour std::functions
en utilisant des classes de modèle, où chaque classe composite traite les valeurs de retour de ses enfants.
Ainsi, les classes de modèle pourrait ressembler à ceci:Modèle composite de std :: fonctions
class AbstractClass {
public:
virtual void process() = 0;
};
template<typename ReturnType>
class PrimitiveClass : public AbstractClass {
public:
ReturnType process() {
// please note, that the result is not returned by the return statement
return this->func(); //this is just for simplicity
}
private:
std::function<ReturnType()> func;
}
template<typename ReturnType, typename ...Args>
class CompositeClass : public AbstractClass {
public:
ReturnType process() {
// --> This is where I want to process all children first and then pass their return values to this->func
// the following code is kind of a pseudo code:
for(auto it = vector.begin(); it != vector.end(); ++it {
results.add((**it).process())
}
return this->func(results)
}
private:
std::function<ReturnType(Args...)> func;
std::vector<std::shared_ptr<AbstractClass>> children;
};
Ainsi, par exemple, j'ai un CompositeClass
avec un std::function<int(int, double, bool)
et les types d'arguments de cette fonction sont également les ReturnType
s de ses enfants. Et je veux passer les valeurs de retour des enfants à ci-dessus std::function
Quelqu'un peut-il penser à un moyen, comment je peux y parvenir?
"le résultat n'est pas retourné par l'instruction return"? Quelle? – melpomene
Mais quel problème avec le passage des résultats comme std :: vecteur au lieu de Args ...? –
@ArtemyVysotsky car les enfants peuvent avoir des types de retour différents @melpomene 'process' est une fonction virtuelle pure avec le type de retour void, alors que ce n'est pas le cas dans les classes dérivées. Dans cet exemple, la fonction 'process' des classes dervies a un type et une valeur de retour, pour rendre les choses plus claires –