LINUX.ORG.RU

Создать указатель того же типа, что и класс

 


1

3

Сабж.

template<typename T>
struct BtsNode {
	BtsNode() = default;
	BtsNode(T&& data):
	        data(std::move(data)) {qDebug() << "BtsNode Move ctor";}
	T data;
	<Как написать сюда BtsNode?> *left{nullptr}, *right{nullptr};
	~BtsNode() noexcept {
		qDebug() << "BtsNode dtor";
		if (left)
			delete left;
		if (right)
			delete right;
	}
};

struct ThreadedBtsNode : public BtsNode<T> {
	std::int_fast8_t lf{0}, rf{1};
	<Чтобы не нужно было пистаь тут ThreadedBtsNode, и вобще удалить эту строку> *left{nullptr}, *right{nullptr};
};

Решение:



template<typename T, typename D>
struct NodeCRTP {
	NodeCRTP() = default;
	NodeCRTP(T&& data):
	        data(std::move(data)) {}
	T data;
	D *left{nullptr}, *right{nullptr};
	~NodeCRTP() noexcept {
		if (left)
			delete left;
		if (right)
			delete right;
	}
};

template<typename T>
struct BtsNode : NodeCRTP<T, BtsNode<T>> {
	using NodeCRTP<T, BtsNode<T>>::NodeCRTP;
};

template<typename T>
struct ThreadedBtsNode : NodeCRTP<T, ThreadedBtsNode<T>>{
	using NodeCRTP<T, ThreadedBtsNode<T>>::NodeCRTP;
	std::int_fast8_t lf{0}, rf{1};
};

Полный код: threadedbts.h bts.h

★★★

Последнее исправление: BruteForce (всего исправлений: 3)

Ничего не понял. Что мешает в базовом классе написать

BtsNode<T> *left{nullptr}, *right{nullptr};

И всё?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от BruteForce

Неужели непонятно, что нужно просто вставить две мои строчки перед твоим кодом (который ты привел в первом посте)?

template<typename T>
struct BtsNode;

template<typename T>
struct BtsNode {
	BtsNode() = default;
	BtsNode(T&& data):
	        data(std::move(data)) {qDebug() << "BtsNode Move ctor";}
	T data;
	BtsNode<T> *left{nullptr}, *right{nullptr};
	~BtsNode() noexcept {
		qDebug() << "BtsNode dtor";
		if (left)
			delete left;
		if (right)
			delete right;
	}
};
m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 2)
Ответ на: комментарий от m0rph

Непонятно то, как это решает проблему? Это решает проблему которой нет, ведь ничего не мешает написать и так

BtsNode *left{nullptr}, *right{nullptr};

BruteForce ★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)

Попытаюсь объяснить еще так: Хочется что-то типа decltype(*this), чтобы внутри BtsNode он был BtsNode, а внутри ThreadedBtsNode — ThreadedBtsNode.

BruteForce ★★★
() автор топика

Написал решение.

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

Зачем? Ты наследуешься публично от этого класса. Что мешает использовать указатель на базовый класс вместо указателя на «текущий»? В крайнем случае можно кастовать указатель к текущему классу.

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

В базовом нет lf и rf, о чем тебе доходчиво расскажет конпелятор.

кастовать указатель к текущему классу.

Очень удобно, не правда ли?

BruteForce ★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от andreyu

А если мне не надо его перееопределять в классах-наследниках? Сейчас он вызывается как надо. *извините я не шарю*

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

лажанул - не сознавайся, гни свою линии, мудачь всех вокруг, будь на LOR-волне, че ты как хабражитель :)

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