fork download
  1. #include <vector>
  2. #include <iostream>
  3. #include <type_traits>
  4.  
  5. template<class ITERATORT,class ADAPTER>class IteratorAdapter : public ITERATORT {
  6. ADAPTER adapter_;
  7. public: IteratorAdapter(ITERATORT underlying,ADAPTER adapter) :
  8. ITERATORT(underlying),
  9. adapter_(adapter)
  10. { }
  11. public: auto operator*(){
  12. return adapter_(ITERATORT::operator*());
  13. }
  14. };
  15. template<class COLLECTION,class ADAPTER>class CollectAdapter{
  16. using CollectAdapterT=CollectAdapter<COLLECTION,ADAPTER>;
  17. COLLECTION* collection_; //<------ #1 problem?
  18. ADAPTER adapter_;
  19. public: CollectAdapter(COLLECTION& collection,ADAPTER adapter){
  20. collection_=&collection;
  21. adapter_=adapter;
  22. }
  23. public: auto begin(){
  24. return IteratorAdapter<
  25. decltype(std::declval<COLLECTION>().begin()),
  26. decltype(adapter_)>
  27. (collection_->begin(),adapter_);
  28. }
  29. public: auto end(){
  30. return IteratorAdapter<
  31. decltype(std::declval<COLLECTION>().end()),
  32. decltype(adapter_)>
  33. (collection_->end(),adapter_);
  34. }
  35. };
  36. class CollectAdapterWidget{
  37. public: template<class COLLECTION,class ADAPTER> static CollectAdapter<COLLECTION,ADAPTER> createAdapter(COLLECTION& collection,ADAPTER adapter){
  38. return CollectAdapter<COLLECTION,ADAPTER>(collection,adapter);
  39. }
  40. };
  41.  
  42.  
  43. int func1(int i){
  44. return i+10;
  45. }
  46. int func2(int i){
  47. return i+100;
  48. }
  49. template<class T> auto utilityAdapter(const T& t){
  50. auto adapter1=CollectAdapterWidget::createAdapter(t,func1);
  51. auto adapter12=CollectAdapterWidget::createAdapter(adapter1,func2);
  52. return adapter12;
  53. }
  54. int main(){
  55. std::vector<int> test;
  56. test.push_back(5);
  57. std::cout<<"start"<<std::endl;
  58. //for(auto b:CollectAdapterWidget::createAdapter(test,func1)){
  59.  
  60. for(auto b:utilityAdapter(test)
  61. ){
  62.  
  63. std::cout<< b<<std::endl;
  64. }
  65. std::cout<<"end"<<std::endl;
  66. }
Runtime error #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
start