Request Short Link
C++ 98
C++ 11
C++ 14
C++ 17
C++ 20
C++ 23
C++ 2c
for-loops as while-loops
array subscription
Show all implicit casts
Show all template parameters of a CallExpr
Use libc++
Transform std::initializer_list
Show noexcept internals
Show padding information
Show coroutine transformation
Show C++ to C transformation
Show object lifetime
Default
15
18
20
22
26
More
GitHub
Patreon
Issues
About
Policies
Examples
C++ Insights @ YouTube
Settings
Version
None
×
Made by
Andreas Fertig
Powered by
Flask
and
CodeMirror
Source:
#include <cstdio> #include <type_traits> template <typename T, typename PARENT> class BaseA { public: BaseA(PARENT& p) : _parent(p) {} public: template <typename P_ = PARENT> auto& parent() { if constexpr (std::is_same_v<P_, PARENT>) { return _parent; } else { return _parent.template parent<P_>(); } } private: PARENT& _parent; }; class AbstractBaseB { }; class BaseB : public AbstractBaseB { public: AbstractBaseB* parent() { return _parent; } private: AbstractBaseB* _parent; }; class Z { public: void foo() {} }; class Y : public BaseA<Y, Z>, public BaseB { public: Y(Z& z) : BaseA(z) { } void foo() {} }; class X : public BaseA<X, Y>, public BaseB { public: X(Y& y) : BaseA(y) { BaseA::parent().foo(); BaseA::parent<Z>().foo(); } }; int main() { Z z; Y y(z); X x(y); }
Insight:
Console: