Статические константы в методе шаблона
От: Аноним  
Дата: 08.12.05 09:58
Оценка:
template<class T> MyClass{
public:
  void Draw(){
    static const CPen pen = CreatePen( PS_DOT, 1, 0 );
  ...
  }
};


Интересует, сколько будет создано объектов CPen: один, по числу инстанцированных MyClass<T>, по числу инстанцированных MyClass<T> с учётом схлопывания оптимизатором одинаковых реализаций метода Draw?
Re: Статические константы в методе шаблона
От: Greg Zubankov СССР  
Дата: 08.12.05 10:04
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>
А>template<class T> MyClass{
А>public:
А>  void Draw(){
А>    static const CPen pen = CreatePen( PS_DOT, 1, 0 );
А>  ...
А>  }
А>};
А>


А>Интересует, сколько будет создано объектов CPen: один, по числу инстанцированных MyClass<T>, по числу инстанцированных MyClass<T> с учётом схлопывания оптимизатором одинаковых реализаций метода Draw?


По числу специализаций класса MyClass<T>, при условии что у экземпляр класса была вызвана функция-член Draw.
Re: Статические константы в методе шаблона
От: Bell Россия  
Дата: 08.12.05 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>template<class T> MyClass{
А>public:
А>  void Draw(){
А>    static const CPen pen = CreatePen( PS_DOT, 1, 0 );
А>  ...
А>  }
А>};
А>


А>Интересует, сколько будет создано объектов CPen: один, по числу инстанцированных MyClass<T>, по числу инстанцированных MyClass<T> с учётом схлопывания оптимизатором одинаковых реализаций метода Draw?


Второе.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Статические константы в методе шаблона
От: Аноним  
Дата: 08.12.05 11:31
Оценка:
Здравствуйте, Bell,

А если так сделать, будет ли создан только один CPen?

inline HPEN dot_pen(){
  static const CPen pen = CreatePen( PS_DOT, 1, 0 );
  return pen;
}

template<class T> MyClass{
public:
  void Draw(){
    HPEN pen = dot_pen();
  ...
  }
};
Re[3]: Статические константы в методе шаблона
От: Bell Россия  
Дата: 08.12.05 11:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если так сделать, будет ли создан только один CPen?


А>
А>inline HPEN dot_pen(){
А>  static const CPen pen = CreatePen( PS_DOT, 1, 0 );
А>  return pen;
А>}

А>template<class T> MyClass{
А>public:
А>  void Draw(){
А>    HPEN pen = dot_pen();
А>  ...
А>  }
А>};
А>


Да, будет создан только один CPen:

7.1.2/4
...
A static local variable in an extern inline function always refers to the same object.
...
Любите книгу — источник знаний (с) М.Горький
Re[4]: Статические константы в методе шаблона
От: Аноним  
Дата: 08.12.05 12:22
Оценка:
лучше наверно так:

class CBase
{
protected:
    static const CPen & dot_pen(void)
    {
        static const CPen pen = CreatePen( PS_DOT, 1, 0 );
        return pen;
    }
};

template<class T> MyClass : public CBase
{
public:
    void Draw(){
         const CPen & pen  = dot_pen();
        ...
    }
};





Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>А если так сделать, будет ли создан только один CPen?


А>>
А>>inline HPEN dot_pen(){
А>>  static const CPen pen = CreatePen( PS_DOT, 1, 0 );
А>>  return pen;
А>>}

А>>template<class T> MyClass{
А>>public:
А>>  void Draw(){
А>>    HPEN pen = dot_pen();
А>>  ...
А>>  }
А>>};
А>>


B>Да, будет создан только один CPen:


B>
B>7.1.2/4
B>...
B>A static local variable in an extern inline function always refers to the same object.
B>...
B>
Re[5]: Статические константы в методе шаблона
От: Аноним  
Дата: 08.12.05 14:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>лучше наверно так:


А>
А>class CBase
А>{
А>protected:
А>    static const CPen & dot_pen(void)
А>    {
А>        static const CPen pen = CreatePen( PS_DOT, 1, 0 );
А>        return pen;
А>    }
А>};

А>template<class T> MyClass : public CBase
А>{
А>public:
А>    void Draw(){
А>         const CPen & pen  = dot_pen();
А>        ...
А>    }
А>};
А>



Скажите, я чего-то наверно не понимаю, но почему такой код не работает?


int test()
{
    return 5;
}

struct A
{
    static const int b = test();
}

A a;
int c = a.b;

MSVC7.3 — c равно 0 (в дебаге). имхо там можно указывать только константное выражание. а вызов функции таковым не является. Я не прав? Как заставить тогда работать.
Re[6]: Статические константы в методе шаблона
От: Lorenzo_LAMAS  
Дата: 08.12.05 15:05
Оценка:
А>MSVC7.3 — c равно 0 (в дебаге). имхо там можно указывать только константное выражание. а вызов функции таковым не является. Я не прав? Как заставить тогда работать.

А никак. Инициализатором для статической константы — члена класса может быть только константное интегральное выражение, которым вызов test() не является — т.е. такой код даже компилироваться не должен.
Of course, the code must be complete enough to compile and link.
Re[6]: Статические константы в методе шаблона
От: VoidEx  
Дата: 08.12.05 15:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажите, я чего-то наверно не понимаю, но почему такой код не работает?



А>
А>int test()
А>{
А>    return 5;
А>}

А>struct A
А>{
А>    static const int b = test();
А>}

А>A a;
А>int c = a.b;
А>

А>MSVC7.3 — c равно 0 (в дебаге). имхо там можно указывать только константное выражание. а вызов функции таковым не является. Я не прав? Как заставить тогда работать.
"ComeauTest.c", line 8: error: expression must have a constant value
static const int b = test();
Re[7]: Статические константы в методе шаблона
От: Аноним  
Дата: 09.12.05 07:59
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>MSVC7.3 — c равно 0 (в дебаге). имхо там можно указывать только константное выражание. а вызов функции таковым не является. Я не прав? Как заставить тогда работать.


L_L>А никак. Инициализатором для статической константы — члена класса может быть только константное интегральное выражение, которым вызов test() не является — т.е. такой код даже компилироваться не должен.

Именно, я так и думал! Но меня ввело в ступор то, что MSVC даже warning'a (level4!) не выдал...
Спасибо
Re[8]: Статические константы в методе шаблона
От: Lorenzo_LAMAS  
Дата: 09.12.05 08:02
Оценка:
Да, я тоже так понял из твоего сообщения, что VC не считает такой инициализатор ошибочным
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.