21

Re: Шаблони вузлів (node). template<typename T, unsigned int N, ...>

steamwater написав:

Неможливо в С++ створити контейнер що мiстить "довiльний" тип даних.

;)

std::vector<void*> any;
Подякували: steamwater1

22 Востаннє редагувалося steamwater (29.02.2024 14:17:25)

Re: Шаблони вузлів (node). template<typename T, unsigned int N, ...>

wander, менi подобаються вашi коментари, то ж не розочаровуйте мене. Вектор вказiвникiв на void це вектор вказiвникiв на void i нiчого окрiм того. Навiть контейнер std::vector<std::any>  як це не дивно, для багатьох, є std::vector<std::any>. То ж моє питання зосталось без вiдповiдi. Мабуть ТС дуже пишається собою. Ну що ж... Ми всi маємо на це право. Але пiдстави в усiх рiзнi)

23

Re: Шаблони вузлів (node). template<typename T, unsigned int N, ...>

Зупинився на такій версії (C++11+):

#define STRUCT(S, T, N, R) struct R;        \
struct S {                                  \
    static const decltype(N) ptr_count = N; \
    using data_t = T;                       \
    using next_t = R;                       \
    using this_t = S;                       \
    data_t data = data_t();                 \
    next_t *ptr[N] = { nullptr };           \
};
#define NODE(A) node_##A##_t
#define TYPE(A, B) STRUCT(NODE(A), T_##A, N_##A, NODE(B))
#define T(A) typename T_##A, unsigned int N_##A

template<T(a)>
struct mono {
    TYPE(a, a)
};
template<T(a), T(b)>
struct duo {
    TYPE(a, b)
    TYPE(b, a)
};
template<T(a), T(b), T(c)>
struct trio {
    TYPE(a, b)
    TYPE(b, c)
    TYPE(c, a)
};

#undef STRUCT
#undef NODE
#undef TYPE
#undef T
Перевірка типів, перевірка можливостей присвойеня
#include <cassert>
#include <typeinfo>
#include "node.hpp"

void test_node_types() {
    duo<int, 2, short, 3>::node_a_t d_a;
    duo<int, 2, short, 3>::node_b_t d_b;
    d_a.data = 2;
    d_a.ptr[0] = &d_b;

    trio<int, 2, int, 2, int, 2>::node_a_t t_a;
    trio<int, 2, int, 2, int, 2>::node_b_t t_b;
    trio<int, 2, int, 2, int, 2>::node_c_t t_c;

    t_a = t_a; // ok
//  t_a = t_b; // type error expected
//  t_a = t_c; // type error expected

//  t_a.ptr[0] = &t_a; // compile time error expected
    t_a.ptr[0] = &t_b; // ok
//  t_a.ptr[0] = &t_c; // compile time error expected

//  t_a.ptr[0]->ptr[0] = &t_a; // compile time error expected
//  t_a.ptr[0]->ptr[0] = &t_b; // compile time error expected
    t_a.ptr[0]->ptr[0] = &t_c; // ok

    t_a.ptr[0]->ptr[0]->ptr[0] = &t_a; // ok
//  t_a.ptr[0]->ptr[0]->ptr[0] = &t_b; // compile time error expected
//  t_a.ptr[0]->ptr[0]->ptr[0] = &t_c; // compile time error expected

    assert(typeid(t_a) != typeid(t_b));
    assert(typeid(t_a) != typeid(t_c));
}
steamwater написав:

Тобто, якщо

leofun01 написав:

вузли такого ж типу як вони самі

то ...

Ця частина вже не актуальна. Вона там була погано описана.
Краще орйентуватись на те що є тепер (в цьому повідомленю).

steamwater написав:

.. це остання спроба якось з вами спiлкуватися. Ви наче не бачили моє повiдомлення ..

Я не такий швидкий як ви. Наберіть витримки, деякі відповіді приходять через роки.

steamwater написав:

.. де я спитав про вашу цiль. Вона сформульована суперечно.

Так і є. На час створеня топіка я ще не вмів чітко формувати шо я хочу. В основному, причина була в не знанні власних можливостей. Користувач в 2016 і користувач в 2024 - не той самий користувач (стан організму змінений, дані оновлено).

24 Востаннє редагувалося steamwater (04.04.2024 16:00:50)

Re: Шаблони вузлів (node). template<typename T, unsigned int N, ...>

Пане leofun01. Ви не вiдповiли на мoї питання. Перелiк їх, та пояснення причин - стан, брак швидкостi, тощо, - не потрiбнi. Ви вiдкрили топiк i витратили щомало часу, але його цiль невiдома. "Бажаю щоб юзеру було зручно", це демонстрацiя нерозумiння сутi не питання як такого, а сенсу мотиву запитаннь у будь якому прекметному обговореннi. Я вважаю що проблема не в вас окремо. Хоча i в вас зокрема. Увесь форум має ваду незрозумiлих питаннь у композицiї з вiдсyтнiсттю дiалогу задля їх пояснення. Хто буде читати многпостові топики без ясного заголовку  i вiдповiдного змiсту? Люди шукають змicт для вирiшення своїх завданнь. Який поiсковик видасть добру статiстику?
Добре. Хай воно так i буде.
Щодо топiку. В мене є деякий досвiд з технiкою type erasure i я не бачу ясної мети. До того ж, практика макровизначеннь це опцiя задля випадкiв, коли без неї неможливо. То ж я не бачу сенсу i можливостi продовжити обговорення.
I так. Я вважаю що вiдповiдати треба якомога швидше, навiть якщо ти не є топiкстартером.

25

Re: Шаблони вузлів (node). template<typename T, unsigned int N, ...>

Дуже вже воно мене тиснуло, тому переписав

#define L(A, B) STRUCT(NODE(A), T_##A, N_##A, NODE(B))
#define T(A) typename T_##A, unsigned int N_##A
#define G(NAME, ...) template<__VA_ARGS__> struct NAME

G(mono, T(a)            ) { L(a,                 a) };
G(duo , T(a), T(b)      ) { L(a, b) L(b,         a) };
G(trio, T(a), T(b), T(c)) { L(a, b) L(b, c) L(c, a) };

#undef STRUCT
#undef NODE
#undef L
#undef T
#undef G
Розширена версія, працює майже всюди (С++11)
#define STRUCT(S, T, N, R)                  \
struct S {                                  \
    static const decltype(N) ptr_count = N; \
    using data_t = T;                       \
    using next_t = R;                       \
    using this_t = S;                       \
    data_t data = data_t();                 \
    next_t *ptr[N] = { nullptr };           \
};
#define NODE(A) node_##A##_t
#define L(A, B) STRUCT(NODE(A), T_##A, N_##A, NODE(B))
#define T(A) typename T_##A, unsigned int N_##A
#define G(NAME, BODY, ...) \
template<__VA_ARGS__>      \
struct NAME {              \
    struct NODE(a);        \
    BODY                   \
};

G(mono  , L(a, a)                        , T(a)                  )
G(duo   , L(b, a)                 L(a, b), T(a), T(b)            )
G(trio  , L(c, a)         L(b, c) L(a, b), T(a), T(b), T(c)      )
G(quadro, L(d, a) L(c, d) L(b, c) L(a, b), T(a), T(b), T(c), T(d))

#undef STRUCT
#undef NODE
#undef L
#undef T
#undef G

Задачу порішав. Топік закрито.