Инициализация локальной статической переменной
От: pasenger  
Дата: 22.11.10 17:46
Оценка:
Хочется синглтон мейерса инициализировать не сходя с места. Допустим, нужен обьект, определяющий черный цвет. Нужно этот объект создать, инициализировать и присвоить в статистическую переменную.
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 не доступно, т.е. никаких лямбд
Заранее спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.