# Boost :

From: Alexander Nasonov (alnsn_at_[hidden])
Date: 2002-09-02 11:00:36

David Abrahams wrote:
> I think we decided that the "right" way to spell this construct was
> "extract<T>(x)..."

Cool way.
I understand how to extract by value or by reference:

int i, *p;
dynamic_any dynany;

{
dynany = 1;

// create a copy of a value holded by dynany:
i = extract<int>(dynany);

int & ri = extract<int &>(dynany);
ri = 2;
const int & rci = extract<const int &>(dynany);
assert(ri == rci && rci != i);
}

{
dynany = &i;

// create a copy of a value holded by dynany:
p = extract<int *>(dynany);

int *& rp = extract<int *&>(dynany);
rp = 0;
int * const & rcp = extract<int * const &>(dynany);
assert(rp == rcp && rcp != p);
}

But how to extract pointers to value holded by dynamic_any? Through pointer
to dynamic_any?

// continued
{
dynany = i;

// get a pointer to value holded by dynany:
p = extract<int *>(&dynany);
*p = 3;
const int * pc = extract<const int *>(&dynany);
assert(*p == *pc);
}

Imagine that someone forgot to type '&' before dynany:
dynany = 5;
p = extract<int *>(dynany); // should be &dynany

This problem is not detected until runtime. At runtime std::bad_cast is
thrown because we are trying to extract pointer to int while dynany holds
int itself! I forgot it several times when I wrote tests.
How to resolve this?
First solution is to deprecate returning a copy to a value holded by
dynamic_any. Second solution is to introduce another function, for example,
```--