Для некоторых синтаксического сахара, я хочу вернуть ссылку на this
, но когда наследуется, функция должна возвращать тип дочернего класса:Возвращение ссылки на это и наследовании
class base {
T &operator!() { return *this; }
};
base b; b = !b;
class child : public base {};
child c; c = !c;
Из-за оператором, я не может просто вернуть указатель и dynamic_cast, он должен быть ссылкой.
Возможно ли это? Использование не decltype(*this)
для T не работает, ни делает auto f()->decltype(*this)
, из-за this
(хотя я не понимаю, почему в авто-случае)
В Scala вы можете написать что-то вроде:
template<typename T> class base {
T &f() { return *this; }
};
class child : public base<child> {};
Но мой g ++ не согласится с этим (не уверен, что это ошибка или просто нет в спецификации?)
Конечно, есть явный способ, но мне интересно, можно ли этого избежать с помощью возможностей C++ 11?
class child : public base {
child &operator!() { base::operator!(); return *this }
};
Пожалуйста, не переопределяйте операторов так, чтобы они меняли свои фундаментальные значения. Это очень плохая идея и приведет к путанице и ошибкам. –
В этом случае это вещь DSL, я использую && на самом деле, и даже если она не возвращает bool, она семантически означает «и» – pascal