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.