Skip to content

Commit 2774592

Browse files
Add slides on auto and literal types as NTTP
1 parent c1a3e22 commit 2774592

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

talk/morelanguage/templates.tex

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,66 @@
172172
\end{cppcode*}
173173
\end{frame}
174174

175+
\begin{advanced}
176+
177+
\begin{frame}[fragile]
178+
\frametitlecpp[17]{Non-type template parameter - auto}
179+
\small
180+
\begin{cppcode}
181+
template <auto Area>
182+
struct Shape {
183+
static constexpr auto area() { return Area; }
184+
};
185+
// we use a type here to hold values
186+
using Area51 = Shape<51>;
187+
188+
template<typename Base>
189+
struct Prism {
190+
double height;
191+
auto volume() const { return height * Base::area(); }
192+
};
193+
Prism<Area51> prism1{2.};
194+
Prism<Shape<3.14>> prism2{3.}; // C++20
195+
\end{cppcode}
196+
\begin{block}{}
197+
\begin{itemize}
198+
\item Using a type to hold a value is a frequently trick
199+
\begin{itemize}
200+
\item See e.g.\ \mintinline{cpp}{std::integral_constant}
201+
\end{itemize}
202+
\end{itemize}
203+
\end{block}
204+
\end{frame}
205+
206+
\begin{frame}[fragile]
207+
\frametitlecpp[20]{Non-type template parameter - literal types}
208+
\footnotesize
209+
\begin{cppcode*}{}
210+
template <typename T> struct Shape {
211+
T area_;
212+
constexpr auto area() const { return area_; }
213+
};
214+
template<auto Base, typename T> struct RightPrism {
215+
T height;
216+
T volume() const { return height * Base.area(); }
217+
constexpr T area() const { ... }
218+
};
219+
RightPrism<Shape{60.}, double> prism1{3.};
220+
221+
template<unsigned int N> struct Polygon {
222+
float radius;
223+
constexpr float area() const { ... }
224+
};
225+
RightPrism<Polygon<4>{2.f}, double> prism2{3.};
226+
RightPrism<RightPrism<Shape<42>, int>{3}, float> hyperprism{3.f};
227+
\end{cppcode*}
228+
\begin{block}{}
229+
Enormous potential! We have yet to see what people will do with it!
230+
\end{block}
231+
\end{frame}
232+
233+
\end{advanced}
234+
175235
\begin{frame}[fragile]
176236
\frametitlecpp[98]{Template specialization}
177237
\begin{block}{Specialization}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy