|
Boost Users : |
Subject: Re: [Boost-users] Map runtime value to type
From: Larry Evans (cppljevans_at_[hidden])
Date: 2015-07-31 07:55:27
On 07/31/2015 05:01 AM, dariomt_at_[hidden] wrote:
> Hi all,
>
> Say I have a compile-time map of <value,type> pairs, and I need to
> access the correct element given a value at runtime and do something
> with that type. That something would be the same for any of the mapped
> types (e.g. calling an overloaded function that would then do the right
> thing depending on the type).
>
> The value would typically be an enum.
>
> Is there anything in the Boost libraries to help with this?
>
> If I used C++11, would there be a simple solution to this?
>
> Regards
>
> PS: I cannot use Boost.Variant
I've tried an alternative variant declared as:
template
< typename... Keys
, typename... Vals
>
struct map
< key_val_var<Keys, Vals>...
>
: key_val_var<Keys, Vals>...
{
private:
typename std::aligned_union<our_size_value,Vals...>::type
my_storage;
std::size_t
my_which;
...
}'
where key_val_var is:
template <typename Key, typename Val>
struct key_val_var
{
public:
using key=Key;
protected:
template<typename... Args>
static
void
construct
( void*storage
, Args&&... args
)
{
new (storage) Val(std::forward<Args>(args)...);
}
static
void
destruct
( void*storage
)
{
auto p=static_cast<Val*>(storage);
p->~Val();
}
static
Val*
get_val_ptr
( void*storage
)
{
auto p=static_cast<Val*>(storage);
return p;
}
When assigning a new value to this variant, the old
value has to be destroyed based on the *runtime* value
of my_which. This is done by indexing into a
temp vector of the static destructs in the superclasses:
void
destroy_which()
{
typedef void(*destructor_t)(void*);
destructor_t destructors[]=
{key_val_var<Keys, Vals>::destruct...} ;
destructors[my_which](storage());
}
I'm guessing you could do something similar for
the get_val_ptr's in the superclass.
If you think it would help, I could post the code.
-regards,
Larry
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net