1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#include <string>
#include <iostream>
#include <vector>
template <typename T>
class Value
{
T _value ;
std::string _name ;
public:
Value(const std::string& name, T v);
const std::string& getName() const;
T get() const;
};
template <typename T> Value<T>::Value(const std::string& name, T v) : _name(name), _value(v) {}
template <typename T> T Value<T>::get() const { return _value; }
template <typename T> const std::string& Value<T>::getName() const { return _name; }
template <typename T>
class Container
{
std::vector<Value<T>*> _values ;
public:
template <typename U>
friend std::ostream& operator <<(std::ostream &os,const Container<U> &obj) ;
void add(Value<T>* v);
};
template <typename T>
std::ostream& operator <<(std::ostream &os,const Container<T> &obj)
{
std::vector<Value<T>*>::const_iterator it = obj._values.begin() ;
for ( ; it != obj._values.end(); it++ )
os << (*it)->getName() << " : " << (*it)->get() << std::endl ;
return os;
}
template <typename T>
void Container<T>::add(Value<T>* v)
{
_values.push_back( v );
}
class Test : public Container<int>
{
Value<int> _v;
public:
Test();
};
Test::Test() : _v("age",12)
{
add( &_v );
}
int main()
{
Test t ;
std::cout << t ;
} |
Partager