LINUX.ORG.RU

[C++] [крик души] Инициализация статического члена шаблонного класса

 ,


0

0

Класс:

namespace stools{
 namespace dev{
 using namespace stools::internal;

 template<typename T>
  class shmem{
   static hash<T const*,vector<shmem<T>*,pod_alloc>,gen_alloc,16>members;
  };

}}

Инициализация (как мог, сократил typeof-ом)

template<> typeof(stools::dev::shmem<int>::members) stools::dev::shmem<int>::members
=
stools::hash <int const*, stools::internal::vector <stools::dev::shmem <int>*, stools::internal::pod_alloc>, stools::internal::gen_alloc, 16>();

Статический член обычного класса без проблем инициализируется проще - без template<>, а также '=' и всего, что за ним. С шаблонным так не прокатывает - undefined reference. Данное же рабочее решение еле как выгуглилось из stackoverflow.com. Читаемость правой части можно было упростить using-ами, но дело то не в этом.

Вопрос, может и риторический: в С++ настолько чудовищные и нелогичные с точки зрения кодонаписания шаблоны или я что-то сделал не так?

//Нет, это не разжигание очередного плюсосрача. Убедительная просьба жабокодерам, лиспотроллям и прочим не холиворить. Вопрос к плюсятникам.

★★★★★

Я давно всем объясняю что C++ хороший язык, но только для кодогенерации.

SV0L0CH
()

Вопрос, может и риторический: в С++ настолько чудовищные и нелогичные с точки зрения кодонаписания шаблоны или я что-то сделал не так?

Да.

В принципе, такие вещи сокращают typedef-ами.

Miguel ★★★★★
()

А вы точно хотите отдельно для каждого типа перекрывать инициализацию статических членов? По идее, вот такой строки (одной) должно быть достаточно:

template<typename T> hash<T const*,vector<shmem<T>*,pod_alloc>, gen_alloc, 16> shmem<T>::members;

ddos3
()
Ответ на: комментарий от ddos3

>По идее, вот такой строки (одной) должно быть достаточно

Хм, точно, хватает. Просто я привык, что статические члены нужно инициализировать отдельно, иначе линкер сходит с ума, и совсем забыл, что шаблоны он прекрасно разруливает. Спасибо!

staseg ★★★★★
() автор топика
Ответ на: комментарий от antony986

>синтаксис с++ убог чуть более чем полностью, я давно это всем объясняюю

Синтаксис ЛЮБОГО языка будет убог, если начать злоупотреблять (в данном случае шаблонами).

З.Ы. Кстати, если злоупотреблять лурком, то синтаксис тоже будет убог. Завязывайте с этим "...чуть более чем полностью...".

pathfinder ★★★★
()
Ответ на: комментарий от staseg

>Просто я привык, что статические члены нужно инициализировать отдельно

а еще можно синглетон замутить, бывает удобнее, чем «дикие» статические члены

annulen ★★★★★
()

>в С++ настолько чудовищные и нелогичные с точки зрения кодонаписания шаблоны

да.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.