En C++, puis-je créer une implémentation d'une interface à la volée (qui lie idéalement les variables de portée locale). expliquer mieux, donc je vais poser ce que je voudrais que le code pour ressembler à (environ):Puis-je créer une classe anonyme à la volée (implémentation d'une interface) en C++?
// Given the following:
class Visitor
{
virtual void visit(const Data& data) = 0;
}
class DataStore
{
void visitData(Visitor& visitor) { /** Invokes visitor with each item of data. */ }
}
// Imagine one would write something like:
void inSomeFunction(DataStore& store)
{
std::string myName = "bob";
class MyVisitor: public Visitor
{
public:
MyVisitor(const std::string& p): person(p);
virtual void visit(const Data& data) override
{
std::cout << person << " is visiting " << data << std::endl;
}
private:
std::string person;
}
MyVisitor myVisitor(myName);
store.visitData(myVisitor);
}
// Instead of the above, I want to write instead something like:
void inSomeFunction(DataStore& store)
{
std::string myName = "bob";
store.visitData(
class: public MyVisitor
{
virtual void visit(const Data& data) override
{
std::cout << myName << " is visiting " << data << std::endl;
}
}
);
}
Je me rends compte que je pose 2 questions ici - pouvez-vous créer une classe de anonymouse comme celui-ci, et pouvez-vous lier des variables de la portée locale (comme je l'ai mentionné myName). Mais j'ai besoin des deux pour que ça soit utile.
Si ce qui précède ne peut pas être fait, ce qui est le plus proche peut arriver à utiliser disons C++ 11 lambdas ou similaire, en termes de concision/manque de passe-partout.
Vous pouvez réaliser ce que vous voulez, mais pas comme vous le souhaitez. J'utiliserais un foncteur pour quelque chose comme ça, ou un visiteur qui prend un pointeur de fonction, alors vous pouvez simplement utiliser un lambda. – csl
Mon seul problème est que la façon dont vous spécifiez la signature de type pour un pointeur de fonction en C++ est horrible. Par exemple. Quelle serait la signature de la méthode visitData si je devais utiliser un pointeur de fonction au lieu d'une interface? – nappyfalcon
A moins qu'il y ait une nouvelle, plus belle façon de spécifier le type d'un paramètre qui prend un pointeur de fonction ...? – nappyfalcon