44 typedef std::map<const dynatype*, T> map_type;
46 static map_type& get ();
52 map<T>::get ().erase (
this);
60 *
this =
static_cast<const T&
>(
rhs);
69 T& retrieve (
const T*) {
70 if (map<T>::get ().
end () == map<T>::get ().find (
this))
72 return map<T>::get () [
this];
77 T& retrieve (
const T*)
const {
78 return const_cast<dynatype*
>(
this)->retrieve ((
T*)0);
91 : p_remove (
rhs.p_remove),
108 return retrieve ((
T*)0);
114 operator const T& ()
const {
115 return retrieve ((
T*)0);
140 : p_remove (&
dynatype::remove<void>),
147typename dynatype::map<T>::map_type&
177 p_remove =
rhs.p_remove;
181 (this->*p_copy)(
rhs);
196 map<T>::get () [
this] =
t;
199 p_remove = &dynatype::remove<T>;
200 p_copy = &dynatype::copy<T>;
213 std::cout <<
"static_cast<const int&>(v1 = 1) = ";
214 std::cout << static_cast<const int&>(
v1) <<
'\n';
219 std::cout <<
"static_cast<const double&>(v1 = 3.14) = ";
220 std::cout << static_cast<const double&>(
v1) <<
'\n';
225 std::cout <<
"static_cast<const double&>(v2 = v1) = ";
226 std::cout << static_cast<const double&>(
v2) <<
'\n';
229 const char*
const literal =
"abc";
232 std::cout <<
"static_cast<const char* const&>(v2 = \"abc\") = ";
233 std::cout << static_cast<const char* const&>(
v2) <<
'\n';
238 std::cout <<
"static_cast<const char* const&>(v1 = v2) = ";
239 std::cout << static_cast<const char* const&>(
v1) <<
'\n';
248 std::cout <<
"static_cast<const char&>(v3) = ";
249 std::cout << static_cast<const char&>(v3) <<
'\n';
253 std::cerr <<
"exception\n";
dynatype(const dynatype &rhs)
dynatype & operator=(const dynatype &rhs)