Created
December 3, 2015 14:18
-
-
Save heplesser/d5a1b2e0067a817168a6 to your computer and use it in GitHub Desktop.
This program creates a vector of a union of double and unsigned long, which can be accessed as either a vector of doubles or a vector of longs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Copyright (C) 2015 Hans Ekkehard Plesser */ | |
#include <vector> | |
#include <iostream> | |
union Elem | |
{ | |
public: | |
explicit Elem(double x): val_as_double(x) {} | |
explicit Elem(unsigned long n): val_as_ulong(n) {} | |
double val_as_double; | |
unsigned long val_as_ulong; | |
}; | |
class Foo: public std::vector<int> | |
{ | |
public: | |
void push_back(int i) { this->push_back(i); } | |
}; | |
class DUVector //: public std::vector<Elem> | |
{ | |
private: | |
typedef std::vector<Elem> VecType; | |
public: | |
class double_iterator | |
{ | |
private: | |
VecType::iterator pos_; | |
public: | |
double_iterator() {} | |
double_iterator( const VecType::iterator& rhs ): pos_(rhs) {} | |
double_iterator& operator++() | |
{ | |
++pos_; | |
return *this; | |
} | |
double& operator*() { return pos_->val_as_double; } | |
bool operator!=( const double_iterator& rhs ) { return pos_ != rhs.pos_; } | |
}; | |
class ulong_iterator | |
{ | |
private: | |
VecType::iterator pos_; | |
public: | |
ulong_iterator() {} | |
ulong_iterator( const VecType::iterator& rhs ): pos_(rhs) {} | |
ulong_iterator& operator++() | |
{ | |
++pos_; | |
return *this; | |
} | |
unsigned long& operator*() { return pos_->val_as_ulong; } | |
bool operator!=( const ulong_iterator& rhs ) { return pos_ != rhs.pos_; } | |
}; | |
void push_back(double x) { Elem e(x); data_.push_back(e); } | |
void push_back(unsigned long n) { data_.push_back(Elem(n)); } | |
const double_iterator& begin_double() { double_begin_ = data_.begin(); return double_begin_; } | |
const double_iterator& end_double() { double_end_ = data_.end(); return double_end_; } | |
const ulong_iterator& begin_ulong() { ulong_begin_ = data_.begin(); return ulong_begin_; } | |
const ulong_iterator& end_ulong() { ulong_end_ = data_.end(); return ulong_end_; } | |
private: | |
VecType data_; | |
double_iterator double_begin_, double_end_; | |
ulong_iterator ulong_begin_, ulong_end_; | |
}; | |
int main() | |
{ | |
DUVector data; | |
data.push_back(1.0); | |
data.push_back(1UL); | |
data.push_back(2.0); | |
data.push_back(2UL); | |
std::cout << "As doubles:" << std::endl; | |
for ( DUVector::double_iterator di = data.begin_double(); di != data.end_double(); ++di ) | |
std::cout << *di << '\t'; | |
std::cout << std::endl; | |
std::cout << "As ulongs:" << std::endl; | |
for ( DUVector::ulong_iterator ui = data.begin_ulong(); ui != data.end_ulong(); ++ui ) | |
std::cout << *ui << '\t'; | |
std::cout << std::endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment