Boost logo

Boost :

Subject: Re: [boost] PCL - Portable C++ Library
From: Mathias Gaunard (mathias.gaunard_at_[hidden])
Date: 2012-02-11 09:37:52


On 02/11/2012 02:39 AM, paul Fultz wrote:

> How would you use a switch?
>
> My design works by creating a metadata class, which would look something
> like this:
>
> class SomeClass
> {
> public:
> const int metadata_count = 2;
> //Partial-specialize this class for each property
> template<class Self, int N>
> struct metadata {};
>
> template<class Self>
> struct metadata<Self, 0>
> {
> Self& self;
> metadata(Self& self) : self(self)
> {}
>
> int get() const { ... }
> void set(int x) { ... }
> const char * name() { return "id"; }
> };
>
> template<class Self>
> struct metadata<Self, 1>
> {
> Self& self;
> metadata(Self& self) : self(self)
> {}
>
> string get() const { ... }
> void set(string x) { ... }
> const char * name() { return "name"; }
> };
> ...
> };
>
> Then I use the for_each from the MPL library to iterator over metadata classes.
> Then the user can access the properties using the visitor pattern like this:
>
> struct property_visitor
> {
> void operator(T x)
> {
> cout<< x.name()<< ","<< x.get();
> }
> };
>
> SomeClass x;
> visit_each(x, property_visitor());

All right so you still need the switch regardless in this case if you
want to implement a property(i) function.

i.e.

switch(i)
{
   case 0:
     return metadata<Self, 0>(self).get();

   case 1:
     return metadata>self, 1>(self).get();

   ...
}

>
> Now, the metadata_count is known because its all in one macro. To
> seperate it to each macro would require using the line number or
> something like that as the index. Which would require me to iterate
> over all integers to find valid metadata.

You could use __COUNTER__ to deal with this, but that's not very
portable, and might also prevent other uses of __COUNTER__ between
properties.

There are template-based techniques to have counters as well, but
they're quite tricky and tend to be fragile with subpar compilers.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk