📄 container.hpp
字号:
// file : Utility/Hetero/Container.hpp
// author : Boris Kolpackov <boris@kolpackov.net>
// copyright : Copyright (c) 2002-2003 Boris Kolpackov
// license : http://kolpackov.net/license.html
#ifndef UTILITY_HETERO_CONTAINER_HPP
#define UTILITY_HETERO_CONTAINER_HPP
#include <typeinfo>
namespace Utility
{
namespace Hetero
{
//
//
//
class Typing {};
//
//
//
class Container
{
public:
~Container ()
{
delete holder_;
}
public:
template <typename T>
Container (T const& t)
: holder_ (new TypedHolder<T> (t))
{
}
Container (Container const& c)
: holder_ (c.holder_->clone ())
{
}
public:
template <typename T>
Container&
operator= (T const& t)
{
delete holder_;
holder_ = 0;
holder_ = new TypedHolder<T> (t);
return *this;
}
Container&
operator= (Container const& c)
{
delete holder_;
holder_ = 0;
holder_ = c.holder_->clone ();
return *this;
}
public:
template <typename T>
operator T& ()
{
return value<T> ();
}
template <typename T>
operator T const& () const
{
return value<T> ();
}
public:
template <typename T>
T&
value ()
{
if (holder_->type () == typeid (T))
{
return dynamic_cast<TypedHolder<T>*>(holder_)->value ();
}
else
{
throw Typing ();
}
}
template <typename T>
T const&
value () const
{
if (holder_->type () == typeid (T))
{
return dynamic_cast<TypedHolder<T>*>(holder_)->value ();
}
else
{
throw Typing ();
}
}
public:
std::type_info const&
type () const
{
return holder_->type ();
}
public:
template <typename T>
friend T
operator+ (Container const& a, T const& b)
{
return a.value<T> () + b;
}
template <typename T>
friend T
operator+ (T const& a, Container const& b)
{
return a + b.value<T> ();
}
private:
struct Holder
{
virtual
~Holder () {}
virtual Holder*
clone () const = 0;
virtual std::type_info const&
type () const = 0;
};
template <typename T>
struct TypedHolder : public Holder
{
TypedHolder (T const& value)
: value_ (value)
{
}
virtual Holder*
clone () const
{
return new TypedHolder<T> (value_);
}
virtual std::type_info const&
type () const
{
return typeid (T);
}
T const&
value () const
{
return value_;
}
T&
value ()
{
return value_;
}
private:
T value_;
};
Holder* holder_;
};
}
}
#endif // UTILITY_HETERO_CONTAINER_HPP
//Container.hpp,v 1.1 2005/05/24 04:33:12 turkaye Exp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -