fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. class Mensch{
  6. public:
  7. void eat(){ std::cout << "Essen\n";}
  8. };
  9.  
  10. class Maus{
  11. public:
  12. void eat(){ std::cout << "Nagen\n";}
  13. };
  14.  
  15. class Huhn{
  16. public:
  17. void eat(){ std::cout << "Picken\n";}
  18. };
  19.  
  20. template <typename T>
  21. void apply_eat(T& t){
  22. t.eat();
  23. }
  24.  
  25.  
  26. template <typename... Others>
  27. class Zoo;
  28.  
  29. template <typename Animal, typename... Others>
  30. class Zoo<Animal, Others...> : public Zoo<Others...>
  31. {
  32. private:
  33. std::vector<Animal> animals;
  34. public:
  35. using Zoo<Others...>::add;
  36. void add(const Animal& f) {
  37. animals.push_back(f);
  38. }
  39.  
  40. void eat_all(){
  41. std::for_each(animals.begin(), animals.end(), apply_eat<Animal>);
  42. animals.clear();
  43. Zoo<Others...>::eat_all();
  44. }
  45. };
  46.  
  47. template <>
  48. class Zoo<>
  49. {
  50. public:
  51. void add(){}
  52. void eat_all(){}
  53. };
  54.  
  55.  
  56. int main()
  57. {
  58. Zoo<Huhn, Maus, Mensch> zoo;
  59. zoo.add(Mensch());
  60. zoo.add(Huhn());
  61. zoo.add(Maus());
  62. zoo.add(Huhn());
  63. zoo.eat_all();
  64. std::cout << "--------------------\n";
  65. zoo.add(Maus());
  66. zoo.add(Huhn());zoo.add(Huhn()); zoo.add(Huhn());
  67. zoo.eat_all();
  68. return 0;
  69. }
  70.  
Success #stdin #stdout 0s 4264KB
stdin
Standard input is empty
stdout
Picken
Picken
Nagen
Essen
--------------------
Picken
Picken
Picken
Nagen