<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: skillman1337</title>
    <description>The latest articles on DEV Community by skillman1337 (@skillman1337).</description>
    <link>https://dev.to/skillman1337</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846839%2F1bc18d87-2dc4-4863-8f75-4e3f0277a689.png</url>
      <title>DEV Community: skillman1337</title>
      <link>https://dev.to/skillman1337</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/skillman1337"/>
    <language>en</language>
    <item>
      <title>What Happens When You Port a 2001 C++ Library to C++20</title>
      <dc:creator>skillman1337</dc:creator>
      <pubDate>Sat, 28 Mar 2026 00:36:25 +0000</pubDate>
      <link>https://dev.to/skillman1337/what-happens-when-you-port-a-2001-c-library-to-c20-47ld</link>
      <guid>https://dev.to/skillman1337/what-happens-when-you-port-a-2001-c-library-to-c20-47ld</guid>
      <description>&lt;p&gt;Andrei Alexandrescu's &lt;a href="https://en.wikipedia.org/wiki/Loki_(C%2B%2B)" rel="noopener noreferrer"&gt;Loki library&lt;/a&gt; shipped in 2001 alongside his book &lt;em&gt;Modern C++ Design&lt;/em&gt;. It was groundbreaking — policy-based design, typelists, smart pointers, abstract factories, visitors, all built with template metaprogramming that pushed C++98 to its absolute limit.&lt;/p&gt;

&lt;p&gt;Twenty-five years later, I rewrote the whole thing in C++20.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/skillman1337/modern-loki" rel="noopener noreferrer"&gt;github.com/skillman1337/modern-loki&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why bother?
&lt;/h2&gt;

&lt;p&gt;The original Loki was held together with recursive template inheritance and prayer. It predates variadic templates, &lt;code&gt;constexpr&lt;/code&gt;, concepts, &lt;code&gt;std::variant&lt;/code&gt;, &lt;code&gt;std::tuple&lt;/code&gt;, and standard threading. Every pattern in the book can be expressed more clearly with modern C++.&lt;/p&gt;

&lt;p&gt;I wanted to see what &lt;em&gt;Modern C++ Design&lt;/em&gt; looks like when you actually have modern C++.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;2001 (original Loki)&lt;/th&gt;
&lt;th&gt;2025 (Modern Loki)&lt;/th&gt;
&lt;th&gt;C++20 feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recursive &lt;code&gt;Typelist&amp;lt;H, T&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Variadic &lt;code&gt;typelist&amp;lt;Ts...&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Parameter packs, fold expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;SingletonHolder&lt;/code&gt; with OS locks&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;singleton_holder&lt;/code&gt; with DCLP&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;std::atomic&lt;/code&gt;, policy-based threading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual &lt;code&gt;SmartPtr&lt;/code&gt; policies&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;smart_ptr&lt;/code&gt; with move semantics&lt;/td&gt;
&lt;td&gt;Move constructors, &lt;code&gt;operator&amp;lt;=&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Functor&lt;/code&gt; with virtual dispatch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;functor&lt;/code&gt; wrapping &lt;code&gt;std::function&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;std::function&lt;/code&gt;, concepts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;AbstractFactory&lt;/code&gt; with virtual MI&lt;/td&gt;
&lt;td&gt;Tuple-based &lt;code&gt;abstract_factory&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;std::tuple&lt;/code&gt;, fold expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GenScatterHierarchy&lt;/code&gt; (recursive)&lt;/td&gt;
&lt;td&gt;Flat variadic inheritance&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;public Unit&amp;lt;Ts&amp;gt;...&lt;/code&gt; pack expansion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows-only threading&lt;/td&gt;
&lt;td&gt;Portable threading policies&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;std::mutex&lt;/code&gt;, &lt;code&gt;std::shared_mutex&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom &lt;code&gt;Tuple&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Deleted&lt;/td&gt;
&lt;td&gt;Just use &lt;code&gt;std::tuple&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The result is header-only, zero dependencies, and compiles on MSVC 2022, GCC 13+, and Clang 17+.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part I'm most proud of: documentation that compiles
&lt;/h2&gt;

&lt;p&gt;Every component has its own Markdown file with an API table and 10 real-world code examples. That's 150 examples total.&lt;/p&gt;

&lt;p&gt;Here's the thing: most C++ library docs are written by someone who last tested the examples three compiler versions ago. I didn't want that.&lt;/p&gt;

&lt;p&gt;So I wrote a Python script that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extracts every &lt;code&gt;cpp&lt;/code&gt; code block from every &lt;code&gt;.md&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Compiles each one against the library headers&lt;/li&gt;
&lt;li&gt;Runs the resulting executable&lt;/li&gt;
&lt;li&gt;Fails CI if anything doesn't compile or crashes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This runs in GitHub Actions on every push. If the docs lie, the build fails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# From scripts/test_docs.py — the core loop
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;test_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PASS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;FAIL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  [&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;#&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what a run looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compiler : msvc (cl.exe)
Examples : 150 across 15 files

  [  1/150] PASS  abstract_factory.md#1 Basic widget factory  (2.6s)
  [  2/150] PASS  abstract_factory.md#2 Cross-platform UI factory  (2.8s)
  ...
  [150/150] PASS  loki.md#10 Clone factory with type_traits  (3.0s)

=== TOTAL: 150/150 passed  (448s) ===
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've never seen another C++ library do this. If yours does, please tell me — I want to steal your approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: before and after
&lt;/h2&gt;

&lt;p&gt;Here's what a typelist looked like in 2001:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Original Loki (C++98)&lt;/span&gt;
&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;TYPELIST_4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Macro expands to:&lt;/span&gt;
&lt;span class="c1"&gt;// Typelist&amp;lt;int, Typelist&amp;lt;double, Typelist&amp;lt;char,&lt;/span&gt;
&lt;span class="c1"&gt;//     Typelist&amp;lt;std::string, NullType&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the same thing today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Modern Loki (C++20)&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;MyTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;typelist&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;static_assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;length_v&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;static_assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;contains_v&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;static_assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;index_of_v&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No macros. No recursive inheritance. Just a variadic template and &lt;code&gt;constexpr&lt;/code&gt; metafunctions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: policy-based singleton
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;loki/singleton.hpp&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;AppConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;db_host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;db_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Thread-safe, DCLP, default lifetime&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;singleton_holder&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
    &lt;span class="n"&gt;AppConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;create_using_new&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;default_lifetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;loki&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class_level_lockable&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Anywhere in your code:&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db_host&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db_port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You pick your creation policy, lifetime policy, and threading policy independently. That's the whole point of Alexandrescu's design — and it reads a lot better in C++20 than it did with &lt;code&gt;IMPLEMENT_DEFAULT_SINGLETON&lt;/code&gt; macros.&lt;/p&gt;




&lt;h2&gt;
  
  
  Is this useful in production?
&lt;/h2&gt;

&lt;p&gt;Honestly? For most of it, no. Use &lt;code&gt;std::unique_ptr&lt;/code&gt; over &lt;code&gt;smart_ptr&lt;/code&gt;. Use &lt;code&gt;std::flat_map&lt;/code&gt; (C++23) over &lt;code&gt;assoc_vector&lt;/code&gt;. Use a real async runtime over the threading policies.&lt;/p&gt;

&lt;p&gt;The README says this upfront. This is a &lt;strong&gt;teaching and reference library&lt;/strong&gt;. It's for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Studying the patterns from &lt;em&gt;Modern C++ Design&lt;/em&gt; in modern idioms&lt;/li&gt;
&lt;li&gt;Teaching template metaprogramming and policy-based design&lt;/li&gt;
&lt;li&gt;Using components that &lt;code&gt;std::&lt;/code&gt; doesn't provide (abstract factories, multi-methods, small object allocators)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/skillman1337/modern-loki.git
&lt;span class="nb"&gt;cd &lt;/span&gt;modern-loki
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;--config&lt;/span&gt; Release
ctest &lt;span class="nt"&gt;--test-dir&lt;/span&gt; build &lt;span class="nt"&gt;-C&lt;/span&gt; Release &lt;span class="nt"&gt;--output-on-failure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just read the docs — every example compiles. I made sure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you've read Modern C++ Design, I'd love to hear which patterns you think aged well and which didn't. Drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>programming</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
