LINUX.ORG.RU

Перегрузка методов с наследованием C++

 ,


1

1

Допустим есть класс:

struct Base{
    void operator +=( int i ){}
};

И мы от него наследуемся с перегрузкой оператора:

struct Dirived : public Base{
    void operator +=( float f ){}
};

При создании объектов типа Dirived, опреатор из класса Base будет не доступен. Если его не перегружать, то все хорошо. Напомните плиз как сделать оба их видимыми. Вроде как-то через using можно было вытащить оператор из Base.

Такой код не работает:

struct Dirived : public Base{
    using void Base::operator +=( int i );
    void operator +=( float f ){}
};
★★★★★

Пол часа гуглил и не мог найти, а как на лоре запостил, так сразу. Решение: using Base::operator+=;

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

Это потому что ЛОР индексируется, и твой вопрос добавил релевантности поиску. Т.е. искало не только твой запрос но и «похожее» на «похожее» из найденного.

Ты в курсе, кстати, что то что ты хочешь это зашквар с точки зрения теории?

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

@peregrine, @no-such-file, Это вспомогательный класс в шаблонном классе, часть операторов которого конфликтуют при перегрузке. Как использовать в данной ситуации enable_if не понял.

Вот настоящий код:

		template<bool before> struct OperatorsBase {
			friend Hook<Args...>;
			OperatorsBase( Hook<Args...> *hook ) : hook( hook ) {}

			size_t operator+=( const std::function<void( Hook<Args...> *, Args &... )> &func ) {
				if constexpr ( before )
					return hook->onBeforeFull += func;
				else
					return hook->onAfterFull += func;
			}
			template<class C>
			size_t operator+=( const std::tuple<C *, void ( C::* )( Hook<Args...> *, Args &... )> &method ) {
				if constexpr ( before )
					return hook->onBeforeFull += method;
				else
					return hook->onAfterFull += method;
			}
			size_t operator+=( const std::function<void( CPU &, Args &... )> &func ) {
				if constexpr ( before )
					return hook->onBeforeDetail += func;
				else
					return hook->onAfterDetail += func;
			}
			template<class C>
			size_t operator+=( const std::tuple<C *, void ( C::* )( CPU &, Args &... )> &method ) {
				if constexpr ( before )
					return hook->onBeforeDetail += method;
				else
					return hook->onAfterDetail += method;
			}
			size_t operator+=( const std::function<void( Args &... )> &func ) {
				if constexpr ( before )
					return hook->onBeforeDefault += func;
				else
					return hook->onAfterDefault += func;
			}
			template<class C> size_t operator+=( const std::tuple<C *, void ( C::* )( Args &... )> &method ) {
				if constexpr ( before )
					return hook->onBeforeDefault += method;
				else
					return hook->onAfterDefault += method;
			}

		protected:
			Hook<Args...> *hook;
		};
		template<bool before> struct Operators : public OperatorsBase<before> {
			friend Hook<Args...>;
			Operators( Hook<Args...> *hook ) : OperatorsBase<before>( hook ) {}

			using OperatorsBase<before>::operator+=;

			size_t operator+=( const std::function<void()> &func ) {
				if constexpr ( before )
					return OperatorsBase<before>::hook->onBeforeShort += func;
				else
					return OperatorsBase<before>::hook->onAfterShort += func;
			}
			template<class C> size_t operator+=( const std::tuple<C *, void ( C::* )()> &method ) {
				if constexpr ( before )
					return OperatorsBase<before>::hook->onBeforeShort += method;
				else
					return OperatorsBase<before>::hook->onAfterShort += method;
			}
		};

И далее по коду класс выбирается на основе conditional_t:

		std::conditional_t<sizeof...( Args ) != 0, Operators<true>, OperatorsBase<true>> onBefore;
		std::conditional_t<sizeof...( Args ) != 0, Operators<false>, OperatorsBase<false>> onAfter;

Если научите делать правильно по другому, например через enable_if, буду благодарен

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

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

Вот настоящий код

Спаси нас Rust от этого приплюснотого ада.

C++ головного мозга это страшно и не подлежит излечению, увы.

Разорванный Флакон

anonymous ()
Ответ на: комментарий от SR_team

Они не конфликтуют, просто метод порождённого класса скрывает одноимённые методы родительских. using это отменяет.

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

Спаси нас Rust от этого приплюснотого ада.

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

alysnix ()
Ответ на: комментарий от anonymous

Если это был вброс, что Rust лучше, чем C++, то вышло прямо противоположное.

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

Реальная задачу - удобно хукать. Предложите лучшую архитектуру

хукать что? хукать - это не описание задачи. это какой-то жаргонизм :)

alysnix ()

Граждане это какой с++? Напридумывали стандартов (*ворчит по-стариковски). Можно ведь обойтись без перегрузки операторов

unstable-case ()
Ответ на: комментарий от unstable-case

Можно ведь обойтись без перегрузки операторов

Хм, а ведь правда можно принять T и в if constexpr разобрать

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

Отличный пример копи-паст программирования. Потом выяснится, что без поллитра pvs studio статического анализа эту лапшу из копи-паст нельзя проверить.

anonymous ()

Dirived

Ну что же ты делаешь…

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

Не вижу там удобства, покажи пример применения твоего удобно. А то у тебя ничего там нет.

anonymous ()
Ответ на: комментарий от SR_team

А ты уверен что эти функции правильно и хорошо делать через перегрузку операторов, а не обычный метод а-ля AppendFunction? Что делает += без заглядывания в код не очевидно, а что делает Append достаточно понятно. А какой оператор придумаете для Insert? Это когда клиентскому коду захочется добавить хэндлер в начало списка

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