Advertisement
andybuckley

vector<X> to vector<Y> implicit casting

May 18th, 2018
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <vector>
  2. #include <string>
  3. #include <iostream>
  4.  
  5. struct B {
  6.   B() {}
  7.   std::string str() const { return "B" + std::to_string(y); }
  8.   int y;
  9. };
  10.  
  11. struct A {
  12.   A(int a) { x = a; }
  13.   operator B () const { B b; b.y = x; return b; }
  14.   std::string str() const { return "A" + std::to_string(x); }
  15.   int x;
  16. };
  17.  
  18.  
  19. struct intvector : std::vector<int> {
  20.   using base = std::vector<int>; using base::base; //< using-declarations don't like template syntax
  21.   operator std::vector<A>() const {
  22.     std::vector<A> rtn(this->begin(), this->end());
  23.     return rtn;
  24.   }
  25.   operator std::vector<B>() const {
  26.     std::vector<B> rtn(size()); // or rtn.reserve(size());
  27.     for (size_t i = 0; i < size(); ++i) rtn[i].y = at(i);
  28.     return rtn;
  29.   }
  30. };
  31.  
  32. struct avector : std::vector<A> {
  33.   using base = std::vector<A>; using base::base; //< using-declarations don't like template syntax
  34.   avector(const std::initializer_list<int>& ints) { for (int i : ints) push_back(i); }
  35.   avector(const intvector& ints) { for (int i : ints) push_back(i); }
  36.   operator std::vector<B>() const {
  37.     std::vector<B> rtn(begin(), end());
  38.     // std::vector<B> rtn(size()); // or rtn.reserve(size());
  39.     // for (size_t i = 0; i < size(); ++i) rtn[i] = at(i);
  40.     return rtn;
  41.   }
  42. };
  43.  
  44.  
  45. int main() {
  46.   intvector vec = {1,2,3,4,5};
  47.   std::vector<A> avec = vec;
  48.   for (const A& a : avec) std::cout << a.str() << std::endl;
  49.   std::vector<B> bvec = vec;
  50.   for (const B& b : bvec) std::cout << b.str() << std::endl;
  51.   avector avec2 = vec;
  52.   std::vector<B> bvec2 = avec2;
  53.   for (const B& b : bvec) std::cout << b.str() << std::endl;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement