LINUX.ORG.RU

История изменений

Исправление www_linux_org_ru, (текущая версия) :

struct Felide
{
   Felide()
   : intId() // бойлерплейт
   , longId() // бойлерплейт
   {
      intId.c = this; // бойлерплейт
      longId.c = this; // бойлерплейт
   }  
   ...

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

struct Felide: 
   public IntrusiveList<Felide, че-то-там>,
   public IntrusiveList<Felide, че-то-другое>
и все

кроме того, у тебя он получился почему-то в ухудшенном варианте, и создатель класса Felide должен *знать* и инициализировать отнюдь не очевидное поле ".с" вместо простого вызова конструктора навроде

Felide(): intId(this), longId(this)

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

еще вижу кучу typedef-ов; для показа идеи можно их было и не писать (хотя на продакшене они конечно нужны) — они приводят меня к мысли, что такой класс стоило бы снабдить итератором в стиле STL, что видимо я и сделаю для своего кода

вообще мой код постился как аналог кода на си, поэтому мне полезно будет причесать его в стиле с++, чтобы можно было сравнить с твоим кодом

Исправление www_linux_org_ru, :

struct Felide
{
   Felide()
   : intId() // бойлерплейт
   , longId() // бойлерплейт
   {
      intId.c = this; // бойлерплейт
      longId.c = this; // бойлерплейт
   }  
   ...

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

class Felide: 
   public IntrusiveList<Felide, че-то-там>,
   public IntrusiveList<Felide, че-то-другое>
и все

кроме того, у тебя он получился почему-то в ухудшенном варианте, и создатель класса Felide должен *знать* и инициализировать отнюдь не очевидное поле ".с" вместо простого вызова конструктора навроде

Felide(): intId(this), longId(this)

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

еще вижу кучу typedef-ов; для показа идеи можно их было и не писать (хотя на продакшене они конечно нужны) — они приводят меня к мысли, что такой класс стоило бы снабдить итератором в стиле STL, что видимо я и сделаю для своего кода

вообще мой код постился как аналог кода на си, поэтому мне полезно будет причесать его в стиле с++, чтобы можно было сравнить с твоим кодом

Исходная версия www_linux_org_ru, :

struct Felide
{
   Felide()
   : intId() // бойлерплейт
   , longId() // бойлерплейт
   {
      intId.c = this; // бойлерплейт
      longId.c = this; // бойлерплейт
   }  
   ...

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

class Felide: 
   public IntrusiveList<Felide, че-то-там>,
   public IntrusiveList<Felide, че-то-другое>
и все

кроме того, у тебя он получился почему-то в ухудшенном варианте, и создатель класса Felide должен *знать* и инициализировать отнюдь не очевидное поле ".с" вместо простого вызова конструктора навроде

Felide(): intId(this), longId(this)

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

еще вижу кучу typedef-ов; для показа идеи можно их было и не писать (хотя на продакшене они конечно нужны) — они приводят меня к мысли, что такой класс стоило бы снабдить итератором в стиле STL, что видимо я и сделаю для своего кода

вообще мой код постился как аналог кода на си, поэтому полезно причесать его в стиле с++, чтобы можно было сравнить с твоим кодом