Comment atteindre virtuel de la fonction de modèle” en C++

tout d'abord: j'ai lu et je sais maintenant qu'un modèle virtuel de la fonction membre n'est pas (encore?) possible en C++. Une solution consisterait à faire de la classe un modèle et utiliser le modèle argument des états-fonction.

Mais dans le contexte de la programmation orientée objet, je trouve que l'exemple ci-dessous ne serait pas très "naturel" si la classe était en fait un modèle. Veuillez noter que le code est en fait pas le travail, mais le gcc-4.3.4 rapports: error: templates may not be ‘virtual’

#include <iostream>
#include <vector>
class Animal {
public:
template< class AMOUNT >
virtual void eat( AMOUNT amount ) const { 
std::cout << "I eat like a generic Animal." << std::endl; 
}
virtual ~Animal() { 
}
};
class Wolf : public Animal {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const { 
std::cout << "I eat like a wolf!" << std::endl; 
}
virtual ~Wolf() { 
}
};
class Fish : public Animal {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const { 
std::cout << "I eat like a fish!" << std::endl; 
}
virtual ~Fish() { 
}
};
class GoldFish : public Fish {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const { 
std::cout << "I eat like a goldfish!" << std::endl; 
}
virtual ~GoldFish() { 
}
};
class OtherAnimal : public Animal {
virtual ~OtherAnimal() { 
}
};
int main() {
std::vector<Animal*> animals;
animals.push_back(new Animal());
animals.push_back(new Wolf());
animals.push_back(new Fish());
animals.push_back(new GoldFish());
animals.push_back(new OtherAnimal());
for (std::vector<Animal*>::const_iterator it = animals.begin(); it != animals.end(); ++it) {
(*it)->eat();
delete *it;
}
return 0;
}

Donc la création d'un "Fish< Montant > foo" est une sorte d'étrange. Cependant, il me semble souhaitable de fournir une quantité arbitraire de nourriture à manger pour chaque animal.

Donc, je suis à la recherche d'une solution sur la façon d'obtenir quelque chose comme

Fish bar;
bar.eat( SomeAmount food );

Cela devient particulièrement utile lorsque l'on regarde la boucle for. On peut, comme pour nourrir une quantité spécifique (FoodAmount) pour tous les différents animaux (via manger() et bind1st() par exemple), il n'a pas pu être fait facilement, bien que je me suis retrouvé trouve cela très inuitive (et donc dans une certaine mesure "naturelles). Alors que certains pourraient veux dire maintenant que cela est dû à la "uniforme"-caractère d'un vecteur, je pense/espère qu'il devrait être possible d'atteindre cet objectif et je voudrais vraiment savoir comment, que c'est étonnant de moi pendant un certain temps maintenant...

[MODIFIER]

Peut-être de clarifier la motivation derrière ma question, je veux programmer un Exportateur de classe et de laisser différente, plus des classes spécialisées en découlent. Tandis que le haut-niveau de l'Exportateur de la classe est généralement uniquement pour les cosmétiques/structurelle but, un GraphExporter-classe est dérivée, qui doit encore servir de classe de base pour encore plus de specialzed à l'exportation. Cependant, à l'instar de l'Animal-exemple, je voudrais être en mesure de définir GraphExporter* même spécialisés/classes dérivées (par exemple sur SpecialGraphExplorer) mais lors de l'appel d'écriture "( out_file )", il doit appeler les fonction de membre pour SpecialGraphExporter au lieu de GraphExporter::write( out_file).

Peut-être ce qui a fait de ma situation et des intentions claires.

Mieux,

Ombre

  • Ce n' fish.eat("string") faire? Ce n' wolf.eat(Fish()) faire? Pouvez-vous utiliser une classe de base abstraite Amount au lieu d'essayer d'en faire un paramètre de modèle?
  • Amount sonne beaucoup comme une valeur, plutôt que d'un type, qui me rend très confus au sujet de pourquoi vous vous sentez un modèle est nécessaire ici.
  • Puis-je vous demander pourquoi voulez-vous décrire une quantité en tant que classe? Il me semble que la quantité type peut bien être connue au moment de la compilation, c'est à dire size_t. Qu'ainsi vous permettra de passer des valeurs différentes. Ou peut-être un autre exemple peut démontrer la nécessité de mieux.
  • Ce n'est pas MS spécifique, ils sont en utilisant une ancienne version de gcc. Si vous voulez jouer avec de nouvelles fonctionnalités de C++ en particulier quelques chouettes choses à partir de C++0x vous devez être sur la plus récente de gcc 4.6+ ou MSVC 10+
  • J'utilise ici juste pour des fins d'illustration. On pourrait penser à cela comme une unité (kg, tonne...).
  • J'ai lu votre question à plusieurs reprises et je ne peux toujours pas comprendre ce que vous essayez d'accomplir avec l'basées sur des modèles de fonction qui n'a pas pu être résolu avec une classe qui stocke de poids (ou de masse) et permet la conversion vers/à partir de différentes unités.
  • Si vous souhaitez utiliser des unités, vous devriez jeter un coup d'oeil à boost::unités (boost.org/doc/libs/1_46_1/doc/html/boost_units.html)
  • En général, ces unités ne sont pas exprimées comme des types uniques, mais comme un seul type qui construit le facteur d'échelle en elle. Vous pouvez paramétrer le type d'aliments, tels qu'un loup peut manger une livre de poisson tandis que l'ours peut manger une tonne de chair humaine, mais ce ne serait pas un cas pour les modèles, en particulier dans la classe de base. manger n'est plus une fonction commune à tous les animaux.
  • Malheureusement, l'exemple n'a pas de servir jusqu'à ce que le bien que j'ai déjà pensé qu'il serait... La question n'était pas sur la réalisation d'une unité de fonctionnalités, ou une telle. Il est/était destiné à refléter mon point de vue sur un lieu "naturel", par exemple, que chaque animal doit manger. Et je cherchais une interface pratique à réaliser quelque chose de similaire avec un Exportateur de classe.
  • Hey Hey - j'ai trouvé une mise en œuvre réelle que vous pouvez être en mesure d'utiliser
  • Dans ce d'autres StackOverflow question, un utilisateur mentionné le "type d'effacement de" technique", vous pourriez être intéressé à regarder.
  • pour semble être le seul à comprendre la question plutôt que de discuter de la validité du jouet en exemple...

InformationsquelleAutor Shadow | 2011-05-03