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
Patreon
Issues
About
Policies
Examples
C++ Insights @ YouTube
Settings
Version
None
×
Sponsors:
Made by
Andreas Fertig
Source:
#include <iostream> using namespace std; struct Nil {}; template <typename T1 = Nil, typename T2 = Nil> struct Tuple1 : Tuple1<T2> { T1 x; using Base = Tuple1<T2>; Base* base() { return static_cast<Base*>(this); } const Base* base() const { return static_cast<const Base*>(this); } Tuple1(const T1& t1, const T2& t2) : Base{ t2 }, x{ t1 } {} }; template <> struct Tuple1<> {}; template <typename T1> struct Tuple1<T1> : Tuple1<> { T1 x; using Base = Tuple1<>; Base* base() { return static_cast<Base*>(this); } const Base* base() const { return static_cast<const Base*>(this); } Tuple1(const T1& t1) : Base{}, x{ t1 } {} }; // --------------------------------------------------------------------------- template <typename...> struct Tuple2; template <> struct Tuple2<> {}; template <typename Head, typename... Tail> struct Tuple2<Head, Tail...> : Tuple2<Tail...> { Tuple2(const Head& head, const Tail&... tail) : Base{ tail... }, m_head{ head } {} private: using Base = Tuple2<Tail...>; Head m_head; }; int main() { cout << "Tuple1 sizes:\n"; cout << sizeof(Tuple1<>) << '\n'; cout << sizeof(Tuple1<int*>) << '\n'; cout << sizeof(Tuple1<int*, Nil>) << '\n'; cout << '\n'; cout << "Tuple2 sizes:\n"; cout << sizeof(Tuple2<>) << '\n'; cout << sizeof(Tuple2<int*>) << '\n'; cout << sizeof(Tuple2<int*, Nil>) << '\n'; return 0; }
Insight:
Console: