История изменений
Исправление 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, что видимо я и сделаю для своего кода
вообще мой код постился как аналог кода на си, поэтому полезно причесать его в стиле с++, чтобы можно было сравнить с твоим кодом