fork download
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class Query;
  9.  
  10. class IFilter
  11. {
  12. public:
  13. virtual void modifyQuery(Query* query) = 0;
  14. };
  15.  
  16. template <typename T>
  17. class Filter : public IFilter
  18. {
  19. public:
  20. virtual void modifyQuery(Query* query);
  21. };
  22.  
  23. class DateFilter;
  24. class NameFilter;
  25.  
  26. class Query
  27. {
  28. public:
  29.  
  30. void applyFilter(IFilter* filter)
  31. {
  32. cout << "applying Filter" << endl;
  33. filter->modifyQuery(this);
  34. }
  35.  
  36. void applyFilter(NameFilter* filter)
  37. {
  38. cout << "applying NameFilter" << endl;
  39. }
  40.  
  41. void applyFilter(DateFilter* filter)
  42. {
  43. cout << "applying DateFilter" << endl;
  44. }
  45. };
  46.  
  47. template <typename T>
  48. void Filter<T>::modifyQuery(Query* query)
  49. {
  50. query->applyFilter(dynamic_cast<T*> (this));
  51. }
  52.  
  53. class DateFilter : public Filter<DateFilter>
  54. {
  55. };
  56.  
  57. class NameFilter : public Filter<NameFilter>
  58. {
  59. };
  60.  
  61. int main()
  62. {
  63. Query* query = new Query();
  64. IFilter* nameFilter = new NameFilter();
  65. IFilter* dateFilter = new DateFilter();
  66.  
  67. std::vector<IFilter*> filterList;
  68. filterList.push_back(nameFilter);
  69. filterList.push_back(dateFilter);
  70.  
  71. for (int i = 0; i < 2; ++i)
  72. {
  73. query->applyFilter(filterList[i]);
  74. }
  75. return 0;
  76. }
Success #stdin #stdout 0.02s 2860KB
stdin
Standard input is empty
stdout
applying Filter
applying NameFilter
applying Filter
applying DateFilter