Хочется синглтон мейерса инициализировать не сходя с места. Допустим, нужен обьект, определяющий черный цвет. Нужно этот объект создать, инициализировать и присвоить в статистическую переменную.
IColorPtr get_black() {
IColorPtr ret(CLSID_RgbColor);
ret->SetRed(0);
ret->SetGreen(0);
ret->Blue(0);
return ret;
}
void foo() {
...
static const IColorPtr black_color = get_black();
...
}
Этот вариант мне не нравится тем, что где-то снаружи находится функция (get_black), которая вообще никого не касается снаружи, и засоряет окружающую среду. Можно сделать через локальный класс, скажем так
void foo() {
...
struct {
IColorPtr operator () () {
IColorPtr ret(CLSID_RgbColor);
ret->SetRed(0);
ret->SetGreen(0);
ret->Blue(0);
return ret;
}
} black_color_wrap;
static const IColorPtr black_color = black_color_wrap();
...
}
Вопрос состоит в том, можно ли вообще закрыть код по созданию black_color даже для области видимости внутри foo? Напишу пример, который не компилируется (более того, компилятор моей VS2005 падает), но который приблизительно показывает, что бы хотелось
void foo() {
...
static const IColorPtr black_color = (struct {
IColorPtr operator () () {
IColorPtr ret(CLSID_RgbColor);
ret->SetRed(0);
ret->SetGreen(0);
ret->Blue(0);
return ret;
}
})(); // "}) ()();" ??
...
}
к сожалению, C++0x не доступно, т.е. никаких лямбд
Заранее спасибо