Re: design question: per method static initializer code
krisprad@yahoo.co.uk ha scritto:
I have methods in which I need to perform once-only initialization.
This is similar to static initializer blocks in Java, but not exact
since initializer blocks are on per-class basis. I have in mind static
initializer on per-method basis.
struct Foo
{
void Bar()
{
<static initializer code> // this should be executed only
once
<other code>
}
};
The way I am doing it is:
struct Foo
{
void Bar()
{
struct StaticBarInitialzer // internal helper class to do
the needful
{
<static initializer code>
}
static StaticBarInitialzer tmp; // initializer code is
called only once per method
<other code>
}
};
One can of course use global singletons, but I do not want to use
global namespace for symbols that are used so locally. I happened to
need this kind of set up several times that I am sure others must have
done it earlier. So, the question is, are there better ways of
achieving this?
It looks like a good idiom to me. It's a bit verbose, but it's not that
bad. You could save some typing by writing it this way:
void Bar()
{
static struct Initializer
{
Initializer() { /* static init code */ }
} init;
/* ... */
}
which is essentially the same.
Things are going to look prettier in C++0x with the advent of lambda
expressions, for example:
// you just need this only once for the entire program
struct ExecuteOnce
{
template <typename T>
ExecuteOnce(T f) { f(); }
};
void Bar()
{
static ExecuteOnce init = [] // <- lambda introducer
{
/* static init code */
};
/* ... */
}
Nice, isn't it?
HTH,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]