Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статический экземпляр класса в шаблоне 
:(
    Опции темы
Lukkoye
Дата 7.1.2014, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(bsa @  7.1.2014,  12:49 Найти цитируемый пост)
Напрямую сделать это нельзя. Можно сделать статический метод, который содержит объявление статической переменной и возвращает ссылку на нее.


Я на самом деле так же делаю, по двум причинам:

1. Код проще написать, и проще потом прочитать.
2. Независимость от порядка инициализации единиц трансляции.


Однако, довольно странно читать "напрямую сделать это нельзя" , когда незадолго до вас уже указали способ, "как это сделать можно".
PM MAIL   Вверх
vinter
Дата 7.1.2014, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(bsa @  7.1.2014,  13:49 Найти цитируемый пост)
Напрямую сделать это нельзя

Можно, и самый первый ответ в этой теме является верным.


--------------------
Мой блог
PM MAIL WWW   Вверх
akizelokro
Дата 7.1.2014, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

template<class T>
class A
{
public:
    class B
    {
    public:
    };
    static B& getB() { static B    mB; return mB; }
};

Цитата(vinter @  7.1.2014,  13:22 Найти цитируемый пост)

Можно, и самый первый ответ в этой теме является верным. 


Вообще-то, это последняя версия класса Singleton

class Singleton 
{
  public:
  static Singleton & getInstance()
  {
    static singleton s;
    return s;
  }
  private:

  //  constructors and destructors
}

Добавлено @ 14:10
 Здесь вообще конфронтация. Изначальная формулировка задачи 
"Требуется создать внутри статический член этого вложенного класса.".
Дырбулышург.
Делайте вложенным классом подобие Singleton, для разнообразия попробуйте его как static class
И очень многое получите.

А вообще, мне просто не было надобности работать с С++ и с шаблонами, тоже мне задача, я работал на C++ как с чистым Cшником. Поэтому не было так весело! smile 

Это сообщение отредактировал(а) akizelokro - 7.1.2014, 14:24


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 7.1.2014, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Вообще, щас пики забивают на thread-safe экземпляр класса Singleton (спорят, какая реализация будет потокобезопасной).
Я так спьяну глянул, и понял, что будет последняя версия (которую я зачтил), и набросок которой привёл bsa/
Остальные пусть ждут стандартной версии компирела.

Меня же больше в примере с singleton заинтересовали не откровения кучи прогеров и не приблуды, которыми они его в разных версиях компилеров пытались "расшифровать", а N-тоны (Double-tone, Three-tone and so on)


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
bsa
Дата 9.1.2014, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Lukkoye @  7.1.2014,  14:21 Найти цитируемый пост)
Однако, довольно странно читать "напрямую сделать это нельзя" , когда незадолго до вас уже указали способ, "как это сделать можно". 
И что, проблем не будет при подключении хидера в разных единицах трансляции и инстанцировании в них с одинаковыми параметрами шаблона? По идее, в этом случае линкер должен будет ругаться на множественное определение символа.
akizelokro, мой пример - это не зачаток "singleton". Просто в singleton используется тот же механизм.
PM   Вверх
vinter
Дата 9.1.2014, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(bsa @  9.1.2014,  11:52 Найти цитируемый пост)
И что, проблем не будет при подключении хидера в разных единицах трансляции и инстанцировании в них с одинаковыми параметрами шаблона? По идее, в этом случае линкер должен будет ругаться на множественное определение символа.

В данном случае, задача линкера заткнуться и свести все эти инстанциации в одну. Тут тот же случай, что и с функциями. Тут нет явной инстанциации в заголовке, а значить ODR не нарушается.

Добавлено @ 14:19
Цитата(14.6.4.1/7)

A specialization for a function template, a member function template, or of a member function or static data member of a class template may have multiple points of instantiations within a translation unit, and in addition to the points of instantiation described above, for any such specialization that has a point of instantiation within the translation unit, the end of the translation unit is also considered a point of instantiation. A specialization for a class template has at most one point of instantiation within a translation unit. A specialization for any template may have points of instantiation in multiple translation units. If two different points of instantiation give a template specialization different meanings according to the one definition rule (3.2), the program is ill-formed, no diagnostic required


Это сообщение отредактировал(а) vinter - 9.1.2014, 14:21


--------------------
Мой блог
PM MAIL WWW   Вверх
Lukkoye
Дата 10.1.2014, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(bsa @  9.1.2014,  10:52 Найти цитируемый пост)
И что, проблем не будет при подключении хидера в разных единицах трансляции и инстанцировании в них с одинаковыми параметрами шаблона?


Нет, не будет.

Кстати, это свойство шаблонов используют для проворачивания трюка "объявить и туловище и реализацию свободной функции в хэдэре так, что бы не иметь проблем с линкером".

Хотя лично я, для проворачивания аналогичного трюка использую статический метод обычного класса.
Если объявить и определить статический метод прямо в декларации класса, то проблем с линкером так же не будет.


PM MAIL   Вверх
mabrarov
Дата 10.1.2014, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



Цитата(akizelokro @ 6.1.2014,  20:37)
Есть. Я даже подноготную рассмотрел 6-летней давности для применения typename и class. Начиная от исторических ссылок, вариантов применения в различных компляторов и тра-ля-ля ещё что-то там. Вообще сам typename и характер его применения сформировался именно на подходе к С++ 11. Я даже с примерами рассмотрел (я не тот чингачгук, который два раза на одни грабли наступает).

Коллеги, не "ткнете" ли меня (как автора первого ответа) туда, где сказано, что typename в данном случае имеет какое-то отношение к C++11. Думаю, разница м/у typename и class при использовании в шаблонах есть только в "Шаблонные параметры: typename и class. Есть ли разница?".

Цитата(akizelokro @ 6.1.2014,  20:37)
Вообще, я так понял, что вообще желательно typename пихать в код куда надо и, куда, как, казалось бы, не надо. И маложелательно употреблять class (вроде новомодная тенденция? )

Там, где я подразумеваю тип (например, в шаблонах), я пишу typename, а не class. Так мне понятнее и логичнее (тип же не ограничивается классом). Тенденция, думается, в лучших традициях C++03 smile

Добавлено через 8 минут и 15 секунд
Цитата(Lukkoye @ 10.1.2014,  19:58)
Кстати, это свойство шаблонов используют для проворачивания трюка "объявить и туловище и реализацию свободной функции в хэдэре так, что бы не иметь проблем с линкером".
Хотя лично я, для проворачивания аналогичного трюка использую статический метод обычного класса.
Если объявить и определить статический метод прямо в декларации класса, то проблем с линкером так же не будет.

Не проще ли inline-функции? Хотя в их случае компилятор волен выбрать любой вариант (а он может зависеть от препроцессора), что как бы намекает на дополнительную аккуратность при использовании inline-функций...
PM MAIL WWW Skype   Вверх
baldina
Дата 10.1.2014, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(mabrarov @  10.1.2014,  20:37 Найти цитируемый пост)
Коллеги, не "ткнете" ли меня (как автора первого ответа) туда, где сказано, что typename в данном случае имеет какое-то отношение к C++11

не-а. потому что это не так.
PM MAIL   Вверх
Lukkoye
Дата 11.1.2014, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(mabrarov @  10.1.2014,  20:37 Найти цитируемый пост)
Не проще ли inline-функции? Хотя в их случае компилятор волен выбрать любой вариант (а он может зависеть от препроцессора), что как бы намекает на дополнительную аккуратность при использовании inline-функций... 


Нет, не проще. Потому что inline или нет - решает компилятор. 

Необходимость следить за этим вручную делает этот подход несопоставимо более сложным, чем простая и узнаваемая всеми программистами статическая функция член, которая не отягощает интеллект дополнительными думками ещё и о линкере.

Это сообщение отредактировал(а) Lukkoye - 11.1.2014, 03:19
PM MAIL   Вверх
nonaot
Дата 14.1.2014, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.1.2014

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.