powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничная шабонная магия
25 сообщений из 143, страница 2 из 6
Пятничная шабонная магия
    #39415170
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут пару раз уронил компилятор(ms vc++2013), "внутренняя ошибка, поменяйте строки местами...", и у меня возник вопрос.
можно как-то (ключи?) посмотреть логи сборки, процесс компиляции, в общем, более развёрнуто увидеть причины ошибок?
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39415396
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39451336
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто знает самый просто способ выдернуть тип шаблонного параметра из класса?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
template<typename T> class C
{};

//...
int main
{
	C<A> c;
	// как извлечь из с имя класса А правильным и желательно простым-красивым способом?
}
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39451339
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА кто знает самый просто способ выдернуть тип шаблонного параметра из класса?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
template<typename T> class C
{};

//...
int main
{
	C<A> c;
	// как извлечь из с имя класса А правильным и желательно простым-красивым способом?
}


Я знаю только об одном способе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
template<typename T> class C
{
public:
   using Type = T;
};

//...
int main
{
	C<A> c;
	typename decltype(c)::Type t;
}
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39455789
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ, о, спасиб, я до этого пользовался таким: 20126260

Btw, у меня проблема

Общий смысл: сделать двух-связанный список классов, по такому принципу:
1. Класс А содержит массив объектов класса В
2. Класс В содержит указатель на объект класса А, в массив которого он входит.
Ну и всё на шаблонах, чтобы можно было сложную иерархию классов написать просто:
Код: plaintext
1.
2.
M<L<S<P>>>  m; // M содержит массив L, содержащий массивы S, содержащие массивы P
//и любой элемент этих классов содержит weak_ptr на родителя

шаг первый был прост, передаём класс B в качестве параметра в шаблон А и там заводим на него массив, ок.
шаг второй был сложнее, так как при правильной передаче всех шаблонных параметров в обе стороны, описания классов (да просто первая строка декларации) разрастались в геометрической прогрессии. Поэтому оставался один вариант: при создании массива внутри класса, класс сам сообщает его элементам себя в качестве родительского. Это очень компактно и не растягивает декларации классов. Всё ок, но только в случае, если классов два. Дело в том, что в вше приведённом объявлении, класс S передаёт себя в качестве родителя в класс P, но сам он ещё ничего про класс L не знает. И вот, получив родителя с элемента класса P, мы не сможем с него вызвать GetParent.
вот что получилось
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
template <typename T, typename PR> class CH : public T  // хитрый план
{
                shared_ptr<PR> m_parent;
public:
                CH(const shared_ptr<PR>& parent) { m_parent = parent; }
                shared_ptr<PR> GetParent() const { return  m_parent; }
};

template <typename L> class M : public enable_shared_from_this<M<L>>
{
public:
                using LL = CH<L, M>; // применение хитрого плана
private:
                vector<shared_ptr<LL>> m_children; // использование применения хитрого плана
public:
                shared_ptr<LL> Add() { m_children.emplace_back(make_shared<LL>(shared_from_this())); return m_children.back(); }
};

template <typename S> class L
{
public:
                using SS = CH<S, L>; // применение хитрого плана
private:
                vector<shared_ptr<SS>> m_children; // использование применения хитрого плана
public:
                shared_ptr<SS> Add() { m_children.emplace_back(make_shared<SS>(shared_from_this())); return m_children.back(); }
};

template <typename P> class S
{
public:
                using PP = CH<P, S>; // применение хитрого плана
private:
                vector<shared_ptr<PP>> m_children; // использование применения хитрого плана
public:
                shared_ptr<PP> Add() { m_children.emplace_back(make_shared<PP>(shared_from_this())); return m_children.back(); }
};

class P
{
};

// somewhere in main
                M<L<S<P>>>  m;
                auto l = m.Add();
                auto s = l->Add();
                auto p = s->Add();
                auto s2 = p->GetParent();
                auto l2 = s2->GetParent(); // <- here's the problem

второй день не могу придумать, как малыми силами это победить
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39457337
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
                M<L<S<P>>>  m;
                auto l = m.Add();
                auto s = l->Add();
                auto p = s->Add();
                auto s2 = p->GetParent();
                auto l2 = s2->GetParent(); // <- here's the problem


Причём, s2 и s - это один и тот же объект в памяти, но s->GetParent() нормально работает. При этом в коде нету виртуальности. Как уболтать компилятор?
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39459489
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Кольцо Всевластия несомненно было шаблоном: работало исключительно согласно классу персонажа, которого в него передавали...


Сделал двойным проходом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
template <typename S> class P2
{
};
template <typename L, typename P> class S2
{
};
template <typename M, class S> class L2
{
};

template <class L> class M : public enable_shared_from_this<M<L>>
{
         vector<shared_ptr<L>> m_vl;
public:
         shared_ptr<L> Add() { m_vl.emplace_back(make_shared<L>(shared_from_this())); return m_vl.back(); }
};
 
template <class S> class L : public L2 <M<L<S>>, S>, public enable_shared_from_this<L<S>>
{
         weak_ptr<M<L<S>>> m_parent;
         vector<shared_ptr<S>> m_vs;
public:
         L(const shared_ptr<M<L<S>>>& parent) { m_parent = parent; }
         shared_ptr<M<L<S>>> GetParent() const { return m_parent.lock(); }
         shared_ptr<S> Add() { m_vs.emplace_back(make_shared<S>(shared_from_this())); return m_vs.back(); }
};
template <class P> class S : public S2 <L<S<P>>, P>, public enable_shared_from_this<S<P>>
{
         weak_ptr<L<S<P>>> m_parent;
         vector<shared_ptr<P>> m_vp;
public:
         S(const shared_ptr<L<S<P>>>& parent) { m_parent = parent; }
         shared_ptr<L<S<P>>> GetParent() const { return  m_parent.lock(); }
         shared_ptr<P> Add() { m_vp.emplace_back(make_shared<P>(shared_from_this())); return m_vp.back(); }
};
class P : public P2<S<P>>
{
         weak_ptr<S<P>> m_parent;
public:
         P(const shared_ptr<S<P>>& parent) { m_parent = parent; }
         shared_ptr<S<P>> GetParent() const { return  m_parent.lock(); }
};

// somewhere in far-far main
shared_ptr<M<L<S<P>>>> m = make_shared<M<L<S<P>>>>();
 
auto l = m->Add();
auto s = l->Add();
auto p = s->Add();
auto s2 = p->GetParent();
auto l2 = s2->GetParent();
auto m2 = l2>GetParent();

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

PS: если вы не пишите ответы, то закидывайте сюда хотя бы интересные вопросы/код/задачки, касающиеся шаблонной магии
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39479478
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Натолкнулся на такую проблему, есть два класса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template <template <typename B> class A> class B1
{
         weak_ptr<A<B1>> _a;
public:
         B1(shared_ptr<A<B1>> a){ _a = a; }
private:
};

template <typename B> class A1 : public enable_shared_from_this<A1<B>>
{
protected:
         shared_ptr<B> _b;
public:
         A1() {}
         virtual void Fill() { _b = make_shared<B>(shared_from_this()); }
};



Тема та же: сделать независимые иерархии классов, связанные между собой только через шаблонные параметры.
Эти два ссылаются друг на друга, всё ок.

Далее, где-то в main:
Код: plaintext
1.
2.
A1<B1<A1>> a;
a.Fill();


Всё ок.

Потом я решаю развивать A1 новым функционалом независимо и создаю A2:
Код: plaintext
1.
2.
3.
template <typename B> class A2 : public A1<B>
{
};



Далее, где-то в main:
Код: plaintext
1.
2.
A2<B1<A2>> a;
a.Fill();


Ошибка, не могу конвертнуть A1<B1<A2>> в A2<B1<A2>>
Потому что функция описана в A1 и делает shared_ptr шаблона, в которой A2 передаётся позже, стало быть Fill об этом никак узнать не может. Переносить Fill каждый раз при создании следующего класса не хочется, да и не так всё просто, как в этом примере.

Как быть?
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39480085
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема решилась тройным проходом
Т.е. вот в этой строке:
Код: plaintext
1.
shared_ptr<M<L<S<P>>>> m = make_shared<M<L<S<P>>>>();


Для класса S, когда он в L передаётся, L ещё выглядит вот так:
Код: plaintext
1.
template <class S> class L : public L2 <M<L<S>>, S>, public enable_shared_from_this<L<S>>


Поэтому то, что передаётся в конструктор S после того, как L проинициализировался и до того - это разные классы. Поэтому, перед тем, как создавать сам объект, я делаю фейковую иерархию, а потом её разворачиваю назад, и вот тогда всё ок.
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487170
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вопрос, есть класс(шаблон), отнаследованный от enable_shared_from_this:

Код: plaintext
1.
2.
class A : public enable_shared_from_this<A>
{};



есть отнаследованный класс B:

Код: plaintext
1.
2.
class B : public A
{}



хочется правильно сделать так:

Код: plaintext
1.
2.
class B : public A, public enable_shared_from_this<B>
{}
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487225
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

А вопрос-то в чём ? Хочется -- сделай!
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487239
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivХочется -- сделай!В том виде, как я написал, не компилируется.
Хочется даже так: чтобы каждый отнаследованный класс T был public enable_shared_from_this<T> неявно.
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487296
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Тут не совсем то, но почитайте )
https://stackoverflow.com/questions/15549722/double-inheritance-of-enable-shared-from-this
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487390
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо
Буду делать по старинке, обычный указатель, закрою все доступы и лишние конструкторы, чтобы можно было проинициализировать 1 раз и буду сидеть бояться. По идее, этот указатель (shared_from_this) передаётся дочернему объекту в конструктор, когда его создаёт этот класс. Т.е. не может быть ситуации, когда ребёнок жив, а родитель нет. Просто хотел сделать всё по-современному :)
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487501
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Главное помнить, что shared_from_this() нельзя вызывать из конструктора ))
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39487973
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyГлавное помнить, что shared_from_this() нельзя вызывать из конструктора ))Не задумывался про это, но оно и ожидаемо, как и бросание эксепшинами в вентилятор конструкторе.
Посмотрел внутренности. Ага, WeakPtr инициализируется в конструкторе shared_ptr() после того, как выполнился конструктор класса-параметра. До этого он Empty.
Спасибо
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39499652
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос.
Есть нитка классов:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
template <typename... TS> class StaticContainer
{};
 
template <> class StaticContainer<>
{
public:
         void EntityAdd2() {}
};

template <typename T1, typename... TS> class StaticContainer<T1, TS...> : public StaticContainer<TS...>
{
protected:
         shared_ptr<T1> m_entity;
public:

         template <typename TE> void EntityAdd2() { 
                 if (is_same<TE, T1>::value)
                          m_entity = make_shared<T1>();
                 else
                          StaticContainer<TS...>::EntityAdd2<TE>();
         }
};



в main:
Код: plaintext
1.
2.
3.
4.
5.
6.
StObj1 o1;
StObj2 o2;
StaticContainer<StObj1, StObj2> st12;
 
st12.EntityAdd2<StObj1>();
st12.EntityAdd2<StObj2>();


не компилируется на строчке
Код: plaintext
1.
StaticContainer<TS...>::EntityAdd2<TE>();


C2275 на тип ТЕ. Недопустимое использование типа в качестве выражения.
Не пойму, что сделать...
Цель: если тип не совпадает, передать управление следующему в нитке классу, до тех пор, пока не найдём тип или не кончатся классы.
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39499727
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Так вызывать можно только шаблонный метод:
Код: plaintext
1.
StaticContainer<TS...>::EntityAdd2<TE>()


А StaticContainer::EntityAdd2 не шаблонный.
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39500045
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, почему не шаблонный?

Код: plaintext
1.
template <typename TE> void EntityAdd2() {...}
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39500145
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Потому что шаблон рекурсивный и в конце рекурсии инстанцируется StaticContainer<TS...> с пустым TS т.е. StaticContainer<> у которого метод нешаблонный.
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39500172
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, так у метода свой, отдельный шаблон на TE
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39500178
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Этот не шаблонный.
Код: plaintext
1.
2.
3.
4.
5.
template <> class StaticContainer<>
{
public:
         void EntityAdd2() {}
};
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39500186
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо! :)
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39585541
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу красиво решить проблему

Есть шаблонный класс со значением внутри:

Код: plaintext
1.
T value_;



Хочу написать функцию, которая принимает значение для (любого типа) value_ в виде строки.

Код: plaintext
1.
2.
3.
4.
5.
6.
C::SetStrValue(string& strValue)
{
	istringstream strm;
	strm.str(strValue);
	strm >> value_;
}



всё ок, пока не попадается строка с пробелами. std::noskipws не спасает. С ним просто останавливается обработка строки на пробеле, без него из строки пробелы пропадают. Как быть?
...
Рейтинг: 0 / 0
Пятничная шабонная магия
    #39585678
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Сначала надо сформулировать как читать строку - например до ближайшего \n, или до конца потока.
Потом надо создать специализацию для строк, и там применить нужный алгоритм чтения строки.
Для построчного чтения или до произвольного разделителя - std::getline
...
Рейтинг: 0 / 0
25 сообщений из 143, страница 2 из 6
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничная шабонная магия
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]