tags:

views:

153

answers:

1

I would like to be able to achieve something like this:

class Zot
{
    namespace A
    {
     static int x;
     static int y;
    }    
}

I am working with a legacy system that uses code generation heavily off a DB schema, and certain fields are exposed as methods/variables in the class definition. I need to add a few extra static variables to these classes and would like to guarantee no clashes with the existing names.

The best I have come up with is to use another struct to wrap the statics as if it were a namespace:

class Zot
{
    struct A
    {
     static int x;
     static int y;
    }    
}

Is there a better way?

Update:

An extra requirement is to be able to access these from a template elsewhere

e.g.

template<class T>
class B
{
  void foo() { return T::A::x; }
};

So putting them in a separate class won't work

+3  A: 

Really the inner struct is your best bet. Another possibility would be to use a typedef to bring in a class of statics. This works well for code generation in that you can separate the extras from the generated code:

In the generated file that doesn't care at all what's in Zot_statics:

class Zot_statics;    
class Zot
{
public:
    typedef Zot_statics A;

    int x; // This is ok
};

In a hand-maintained header for when you need to access x and y:

class Zot_statics
{
public:
    static int x;
    static int y;
};

In a hand-maintained cpp file:

int Zot_statics::x;
int Zot_statics::y;

And your template should work just fine with Zot::X referring to the instance variable X on Zot, and Zot::A::x refering to the static variable.

Eclipse