News

CopperSpice: Template Parameters

New video on the CopperSpice YouTube Channel:

Template Parameters

by Barbara Geller and Ansel Sermersheim

About the video:

Do you know the precise difference between a parameter and an argument? Where can a default argument appear for a template parameter? We have some answers in our newest C++ video.

Please take a look and remember to subscribe.

Using GitHub Actions for Continuous Integration -- Richard Thomson

Utah C++ Programmers has released a new video:

Using GitHub Actions for Continuous Integration

by Richard Thomson

From the video description:

GitHub actions allow you to set up continuous integration for your C++ project. You can configure, build and test your code in a variety of operating systems and hardware configurations.

This month, Richard Thomson will give us an introduction to GitHub actions for continuous integration of C++ projects. We'll look at how to set up automatic building and testing of code on various repository events, such as commits, pull requests, and so-on.

Some of the topics we will cover are:

  • How to configure GitHub actions from scratch
  • How to use some continuous integration project templates
  • How to run tests
  • How to integrate custom build/test environments

https://www.youtube.com/watch?v=1q8BQtvr8sY

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/1q8BQtvr8sY" title="YouTube video player" width="560"></iframe>

 

C++23: Syntactic Sugar with Deducing This -- Rainer Grimm

syntacticsugar-grimm.pngThe Curiously Recurring Template Pattern (CRTP) is a heavily used idiom in C++. It is similarly resistant to understanding as the classic design pattern visitor I presented in my last post: “C++23: Deducing This“.  Thanks to deducing this, we can remove the C and R from the abbreviation.

C++23: Syntactic Sugar with Deducing This

By Rainer Grimm

From the article:

CRTP

The acronym CRTP stands for the C++ idiom Curiously Recurring Template Pattern and denotes a technique in C++ in which a class Derived is derived from a class template Base. The critical point is that Base has Derived as a template argument.

template <typename T>
class Base{
    ...
};

class Derived : public Base<Derived>{
    ...
};
CRTP is typically used to implement static polymorphism. Unlike dynamic polymorphism, static polymorphism happens at compile time and does not require an expensive run-time pointer indirection.

Introduction to Programming with C++ For Engineers, Book Review -- Bartlomiej Filipek

introprogramming-book.pngLots of practical examples, general programming, software development techniques, OOP, parallel algorithms, plus C++ to combine it all into working applications. This is a short introduction to the book “Introduction to Programming with C++” by Prof. Boguslaw Cyganek, an excellent book for students who start their journey with system coding.

Introduction to Programming with C++ For Engineers, Book Review

By Bartlomiej Filipek

From the review:

“I have been highly impressed by Introduction to Programming with C++ for Engineers and can’t recommend it enough. With its content designed keeping in mind the author’s own students, the book assumes no prior programming experience, making it an excellent choice for anyone who wishes to learn C++ as their first programming language. […]
The book extends its reach beyond just the programming language, shedding light on aspects such as microprocessor operations, software development processes, UML, and more. Furthermore, the appendices cover essential tools like CMake and Git, making this book a comprehensive guide for anyone delving into C++ programming. The detailed content, careful attention to detail, and clarity in explaining concepts have garnered much praise for the book. This makes it an invaluable resource for those aspiring to learn and understand modern C++ programming."

Let's Enumerate the UB -- Shafik Yaghmour

ShafikYaghmour.jpgSome time ago I started working on P1705 Enumerating Core Undefined Behavior, I have collected a large set of undefined behavior (UB) during that time. There is going to be a lot of work involved in getting the annex into shape and editing it into the standard. While this work is ongoing, I will take some time to write blog posts to explore the set of undefined behaviors.

Let's Enumerate the UB

By Shafik Yaghmour

From the article:

In these posts I will cover: why we have each undefined behavior, some consequences of running afoul of each UB and tools we can use to catch UB. My plan is to enumerate them in the order they appear in the standard.

IFNDR (What is that?)

Before we go on, let’s talk about a term we find in the standard, ill-formed no diagnostic required; also known as IFNDR. This is like undefined behavior in that the standard places no requirements on a program that contains IFNDR constructs, see [intro.compliance.general]p2.2 which says (emphasis mine):

If a program contains a violation of a rule for which no diagnostic is required, this document places no requirement on implementations with respect to that program.

compared to the defintion of undefined behavior which says:

behavior for which this document imposes no requirements

The main difference is that IFNDR is a static property of your code (it is a propety of the program).

C++23: Deducing This -- Rainer Grimm

grimm-deducingthis.pngAnyone who thinks a small C++ standard follows a significant C++ standard is wrong. C++23 provides powerful extensions to C++20. These extensions include the core language, particularly the standard library. Today, I present a small but very impactful feature of the core language: deducing this.

C++23: Deducing This

By Rainer Grimm

From the article:

Deducing this, sometimes also called explicit object parameter, allows it to make the implicit this pointer of a member function explicit. Like Python, the explicit object parameter must be the first function parameter and is called in C++, by convention, Self and self.
struct Test {

    void implicitParameter();               // implicit this pointer
    void explictParameter(this Self& self); // explicit this pointer
};
Deducing this enables new programming techniques in C++23: deduplication of function overloading based on the object’s lvalue/rvalue value category and constness. Additionally, you can reference a lambda and invoke it recursively. Furthermore, deducing this simplifies the implementation of CRTP

2023-07 Mailing Available

The 2023-07 mailing of new standards papers is now available.

 

WG21 Number Title Author Document Date Mailing Date Previous Version Subgroup
N4955 WG21 2023-06 Admin telecon minutes Nina Ranns 2023-06-05 2023-07   All of WG21
N4957 WG21 June 2023 Varna Minutes of Meeting Nina Ranns 2023-06-28 2023-07   All of WG21
P0260R6 C++ Concurrent Queues Detlef Vollmann 2023-06-16 2023-07 P0260R5 SG1 Concurrency and Parallelism,LEWG Library Evolution
P0260R7 C++ Concurrent Queues Detlef Vollmann 2023-07-13 2023-07 P0260R6 SG1 Concurrency and Parallelism,LEWG Library Evolution
P0543R3 Saturation arithmetic Jens Maurer 2023-07-19 2023-07 P0543R2 LWG Library
P0843R7 inplace_vector Gonzalo Brito Gadeschi 2023-06-16 2023-07 P0843R6 LEWG Library Evolution
P0843R8 inplace_vector Gonzalo Brito Gadeschi 2023-06-16 2023-07 P0843R7 LEWG Library Evolution
P0901R11 Size feedback in operator new Thomas Köppe 2023-06-20 2023-07 P0901R10 EWG Evolution,CWG Core
P1030R6 std::filesystem::path_view Niall Douglas 2023-06-16 2023-07 P1030R5 LEWG Library Evolution
P1324R1 RE: Yet another approach for constrained declarations Mihail Naydenov 2023-07-06 2023-07 P1324R0 EWG Evolution
P1383R2 More constexpr for cmath and complex Oliver Rosten 2023-06-15 2023-07 P1383R1 SG6 Numerics,LEWG Library Evolution,LWG Library
P1729R2 Text Parsing Elias Kosunen 2023-07-07 2023-07 P1729R1 SG9 Ranges,SG16 Unicode,LEWG Library Evolution
P1928R5 std::simd - Merge data-parallel types from the Parallelism TS 2 Matthias Kretz 2023-06-19 2023-07 P1928R4 LEWG Library Evolution
P1928R6 std::simd - Merge data-parallel types from the Parallelism TS 2 Matthias Kretz 2023-06-19 2023-07 P1928R5 LEWG Library Evolution
P2169R4 A Nice Placeholder With No Name Corentin Jabot 2023-06-16 2023-07 P2169R3 CWG Core
P2407R4 Freestanding Library: Partial Classes Emil Meissner 2023-06-28 2023-07 P2407R3 LWG Library
P2487R1 Is attribute-like syntax adequate for contract annotations? Andrzej Krzemieński 2023-06-11 2023-07 P2487R0 SG21 Contracts
P2521R4 Contract support -- Record of SG21 consensus Andrzej Krzemieński 2023-06-15 2023-07 P2521R3 SG21 Contracts
P2542R3 views::concat Hui Xie 2023-06-09 2023-07 P2542R2 SG9 Ranges,LEWG Library Evolution
P2546R5 Debugging Support René Ferdinand Rivera Morell 2023-07-05 2023-07 P2546R4 LWG Library
P2548R6 copyable_function Michael Florian Hava 2023-06-15 2023-07 P2548R5 LWG Library
P2552R3 On the ignorability of standard attributes Timur Doumler 2023-06-14 2023-07 P2552R2 EWG Evolution,CWG Core
P2591R4 Concatenation of strings and string views Giuseppe D'Angelo 2023-07-11 2023-07 P2591R3 LEWG Library Evolution
P2630R4 Submdspan Christian Trott 2023-06-22 2023-07 P2630R3 LEWG Library Evolution,LWG Library
P2637R3 Member visit Barry Revzin 2023-06-14 2023-07 P2637R2 LEWG Library Evolution
P2641R4 Checking if a union alternative is active Barry Revzin 2023-06-14 2023-07 P2641R3 LEWG Library Evolution
P2642R3 Padded mdspan layouts Mark Hoemmen 2023-07-14 2023-07 P2642R2 LEWG Library Evolution
P2662R2 Pack Indexing Corentin Jabot 2023-07-15 2023-07 P2662R1 EWG Evolution
P2689R2 atomic_accessor Christian Trott 2023-07-20 2023-07 P2689R1 SG1 Concurrency and Parallelism,LEWG Library Evolution
P2697R1 Interfacing bitset with string_view Michael Florian Hava 2023-06-15 2023-07 P2697R0 LWG Library
P2714R1 Bind front and back to NTTP callables Zhihao Yuan 2023-06-16 2023-07 P2714R0 LWG Library
P2717R2 Tool Introspection René Ferdinand Rivera Morell 2023-06-15 2023-07 P2717R1 SG15 Tooling
P2727R3 std::iterator_interface Zach Laine 2023-06-13 2023-07 P2727R2 LEWG Library Evolution
P2728R4 Unicode in the Library, Part 1: UTF Transcoding Zach Laine 2023-06-19 2023-07 P2728R3 SG16 Unicode,LEWG Library Evolution
P2728R5 Unicode in the Library, Part 1: UTF Transcoding Zach Laine 2023-07-11 2023-07 P2728R4 SG16 Unicode,LEWG Library Evolution
P2741R3 user-generated static_assert messages Corentin Jabot 2023-06-16 2023-07 P2741R2 EWG Evolution
P2752R3 Static storage for braced initializers Arthur O'Dwyer 2023-06-14 2023-07 P2752R2 CWG Core
P2757R3 Type checking format args Barry Revzin 2023-06-14 2023-07 P2757R2 LEWG Library Evolution
P2767R1 flat_map/flat_set omnibus Arthur O'Dwyer 2023-07-14 2023-07 P2767R0 LEWG Library Evolution,LWG Library
P2776R0 2023-05 Library Evolution Poll Outcomes Bryce Adelstein Lelbach 2023-06-16 2023-07   LEWG Library Evolution
P2779R1 Make basic_string_view's range construction conditionally explicit Giuseppe D'Angelo 2023-07-11 2023-07 P2779R0 SG9 Ranges,SG16 Unicode,LEWG Library Evolution
P2781R3 std::constexpr_v Zach Laine 2023-06-12 2023-07 P2781R2 LEWG Library Evolution
P2785R0 Relocating prvalues Sébastien Bini, Ed Catmur 2023-06-12 2023-07   EWGI SG17: EWG Incubator,LEWGI SG18: LEWG Incubator,SG23 Safety and Security
P2785R1 Relocating prvalues Sébastien Bini, Ed Catmur 2023-06-12 2023-07 P2785R0 EWGI SG17: EWG Incubator,LEWGI SG18: LEWG Incubator,SG23 Safety and Security
P2785R2 Relocating prvalues Sébastien Bini, Ed Catmur 2023-06-14 2023-07 P2785R1 EWGI SG17: EWG Incubator,LEWGI SG18: LEWG Incubator,SG23 Safety and Security
P2785R3 Relocating prvalues Sébastien Bini, Ed Catmur 2023-06-14 2023-07 P2785R2 EWGI SG17: EWG Incubator
P2786R2 Trivial relocatability options Mungo Gill 2023-06-16 2023-07 P2786R1 EWG Evolution
P2795R0 Correct and incorrect code, and "erroneous behaviour" Thomas Köppe 2023-06-13 2023-07   SG12 Undefined and Unspecified Behavior,SG23 Safety and Security,EWG Evolution,CWG Core
P2795R1 Erroneous behaviour for uninitialized reads Thomas Köppe 2023-06-15 2023-07 P2795R0 SG12 Undefined and Unspecified Behavior,SG23 Safety and Security,EWG Evolution,CWG Core
P2795R2 Erroneous behaviour for uninitialized reads Thomas Köppe 2023-06-16 2023-07 P2795R1 SG12 Undefined and Unspecified Behavior,SG23 Safety and Security,EWG Evolution,CWG Core
P2809R1 Trivial infinite loops are not Undefined Behavior JF Bastien 2023-06-17 2023-07 P2809R0 SG1 Concurrency and Parallelism,SG22 Compatability,EWG Evolution,LEWG Library Evolution
P2810R1 is_debugger_present is_replaceable René Ferdinand Rivera Morell 2023-07-06 2023-07 P2810R0 LEWG Library Evolution
P2811R5 Contract-Violation Handlers Joshua Berne 2023-06-28 2023-07 P2811R4 SG21 Contracts
P2811R6 Contract-Violation Handlers Joshua Berne 2023-06-28 2023-07 P2811R5 SG21 Contracts
P2811R7 Contract-Violation Handlers Joshua Berne 2023-07-13 2023-07 P2811R6 SG21 Contracts
P2814R1 Trivial Relocatability --- Comparing P1144 with P2786 Mungo Gill 2023-06-16 2023-07 P2814R0 EWG Evolution
P2819R1 Add tuple protocol to complex Michael Florian Hava 2023-07-14 2023-07 P2819R0 LEWG Library Evolution,LWG Library
P2821R2 span.at() Jarrad J. Waterloo 2023-05-26 2023-07 P2821R1 SG23 Safety and Security,LEWG Library Evolution
P2821R3 span.at() Jarrad J. Waterloo 2023-06-12 2023-07 P2821R2 SG23 Safety and Security,LEWG Library Evolution
P2828R2 Copy elision for direct-initialization with a conversion function (Core issue 2327) Brian Bi 2023-06-12 2023-07 P2828R1 CWG Core
P2834R1 Semantic Stability Across Contract-Checking Build Modes Joshua Berne, John Lakos 2023-06-08 2023-07 P2834R0 SG21 Contracts
P2835R1 Expose std::atomic_ref's object address Gonzalo Brito Gadeschi 2023-06-26 2023-07 P2835R0 LEWG Library Evolution
P2836R1 std::basic_const_iterator should follow its underlying type's convertibility Christopher Di Bella 2023-07-11 2023-07 P2836R0 SG9 Ranges,LEWG Library Evolution,LWG Library
P2845R1 Formatting of std::filesystem::path Victor Zverovich 2023-06-08 2023-07 P2845R0 SG16 Unicode,LEWG Library Evolution
P2865R1 Remove Deprecated Array Comparisons from C++26 Alisdair Meredith 2023-06-16 2023-07 P2865R0 SG22 Compatability,EWG Evolution
P2872R1 Remove `wstring_convert` From C++26 Alisdair Meredith 2023-06-07 2023-07 P2872R0 LEWG Library Evolution
P2874R1 Mandating Annex D Alisdair Meredith 2023-06-11 2023-07 P2874R0 LWG Library
P2874R2 Mandating Annex D Alisdair Meredith 2023-06-12 2023-07 P2874R1 LWG Library
P2877R0 Contract Build Modes and Semantics Joshua Berne 2023-07-13 2023-07   SG21 Contracts
P2878R2 Reference checking Jarrad J. Waterloo 2023-06-10 2023-07 P2878R1 SG23 Safety and Security
P2878R3 Reference checking Jarrad J. Waterloo 2023-06-23 2023-07 P2878R2 SG23 Safety and Security
P2878R4 Reference checking Jarrad J. Waterloo 2023-07-08 2023-07 P2878R3 SG23 Safety and Security
P2885R0 Requirements for a Contracts syntax Timur Doumler 2023-07-16 2023-07   SG21 Contracts,EWG Evolution
P2898R1 Build System Requirements for Importable Headers Daniel Ruoso 2023-06-12 2023-07 P2898R0 SG15 Tooling
P2902R0 constexpr 'Parallel' Algorithms Oliver Rosten 2023-06-17 2023-07   LEWG Library Evolution,LWG Library
P2904R0 Removing exception in precedence rule(s) when using member pointer syntax Annop Rana 2023-06-13 2023-07   EWGI SG17: EWG Incubator
P2905R0 Runtime format strings Victor Zverovich 2023-07-15 2023-07   LEWG Library Evolution
P2905R1 Runtime format strings Victor Zverovich 2023-07-15 2023-07 P2905R0 LWG Library
P2906R0 Structured bindings for std::extents Bernhard Manfred Gruber 2023-05-29 2023-07   LEWG Library Evolution
P2910R0 C++ Standard Library Ready Issues to be moved in Varna, Jun. 2023 Jonathan Wakely 2023-06-09 2023-07   All of WG21
P2911R0 Python Bindings with Value-Based Reflection Adam Lach 2023-07-10 2023-07   SG7 Reflection
P2912R0 Concurrent queues and sender/receivers Gor Nishanov 2023-07-04 2023-07   SG1 Concurrency and Parallelism
P2915R0 Proposed resolution to CWG1223 Corentin Jabot 2023-06-13 2023-07   CWG Core
P2917R0 An in-line defaulted destructor should keep the copy- and move-operations Andreas Fertig 2023-06-14 2023-07   EWGI SG17: EWG Incubator,EWG Evolution
P2917R1 An in-line defaulted destructor should keep the copy- and move-operations Andreas Fertig 2023-07-05 2023-07 P2917R0 EWG Evolution
P2918R0 Runtime format strings II Victor Zverovich 2023-07-15 2023-07   LEWG Library Evolution
P2918R1 Runtime format strings II Victor Zverovich 2023-07-15 2023-07 P2918R0 LWG Library
P2920R0 Library Evolution Leadership's Understanding of the Noexcept Policy History Nevin Liber 2023-06-16 2023-07   All of WG21
P2921R0 Exploring std::expected based API alternatives for buffer_queue Gor Nishanov 2023-07-04 2023-07   LEWG Library Evolution
P2922R0 Core Language Working Group "ready" Issues for the June, 2023 meeting Jens Maurer 2023-06-16 2023-07   CWG Core
P2925R0 inplace_vector - D0843R7 LEWG presentation David Sankel 2023-06-19 2023-07   LEWG Library Evolution
P2926R0 std::simd types should be regular - P2892R0 LEWG presentation David Sankel 2023-06-19 2023-07   LEWG Library Evolution
P2929R0 simd_invoke Daniel Towner 2023-07-19 2023-07   LEWG Library Evolution
P2930R0 Formatter specializations for the standard library Mark de Wever 2023-07-15 2023-07   LEWG Library Evolution,LWG Library
P2931R0 WG21 June 2023 Varna Meeting Record of Discussion Nina Ranns 2023-06-28 2023-07   All of WG21
P2937R0 Freestanding: Remove strtok Ben Craig 2023-07-02 2023-07   LEWG Library Evolution
P2940R0 switch for Pattern Matching Mihail Naydenov 2023-07-06 2023-07   EWGI SG17: EWG Incubator
P2941R0 Identifiers for Pattern Matching Mihail Naydenov 2023-07-06 2023-07   EWGI SG17: EWG Incubator
P2944R0 Comparisons for reference_wrapper Barry Revzin 2023-07-09 2023-07   LEWG Library Evolution
P2945R0 Additional format specifiers for time_point Barry Revzin 2023-07-13 2023-07   LEWG Library Evolution
P2946R0 A flexible solution to the problems of `noexcept` Pablo Halpern 2023-07-19 2023-07   EWGI SG17: EWG Incubator
P2947R0 Contracts must avoid disclosing sensitive information Andrei Zissu 2023-07-20 2023-07   SG21 Contracts,SG23 Safety and Security
P2949R0 Slides for P2861R0: Narrow Contracts and `noexcept` are Inherently Incompatable John Lakos 2023-07-14 2023-07   EWGI SG17: EWG Incubator,SG21 Contracts,EWG Evolution,LEWG Library Evolution
P2950R0 Slides for P2836R1: std::basic_const_iterator should follow its underlying type's convertibility Tomasz Kamiński 2023-07-11 2023-07   LEWG Library Evolution
P2951R0 Shadowing is good for safety Jarrad J. Waterloo 2023-07-14 2023-07   EWGI SG17: EWG Incubator,LEWGI SG18: LEWG Incubator,SG23 Safety and Security
P2951R1 Shadowing is good for safety Jarrad J. Waterloo 2023-07-16 2023-07 P2951R0 SG23 Safety and Security

HPX V1.9.1 released -- STE||AR Group

The STE||AR Group has released V1.9.1 of HPX -- A C++ Standard library for Concurrency and Parallelism.

HPX V1.9.1 Released

We have released HPX 1.9.1 that adds a number of small new features and fixes a handful of problems discovered since the last 1.9.0 release. In particular: we fixed various occasional hanging during startup and shutdown in distributed scenarios. We also added support for zero-copy serialization on the receiving side to the TCP, MPI, and LCI parcelports. Moreover, we have added support for Visual Studio 2019 and GCC using MINGW on Windows, and also support for GCC 13 and Clang 15.0.0. Furthermore, we aligned our header names to their standards counterparts so porting from standard C++ to HPX is now easier. Last but not least, and by adhering to popular demand, we started adding migration guides for people interested in moving their codes away from other, commonplace parallelization frameworks like OpenMP and MPI. We have also continued to improve our documentation, please have a look here.

If you have any questions, comments, or exploits to report you can reach us on IRC or Matrix (#ste||ar on libera.chat) or email us at hpx-users. We depend on your input!

You can download the release from our releases page or check out the v1.9.1 tag using git. A full list of changes can be found in the release notes.

HPX is a general-purpose parallel C++ runtime system for applications of any scale. It implements all of the related facilities as defined by the C++20 Standard. As of this writing, HPX provides the only widely available open-source implementation of the new C++17, C++20, and C++23 parallel algorithms, including a full set of parallel range-based algorithms. Additionally, HPX implements functionalities proposed as part of the ongoing C++ standardization process, such as large parts of the features related parallelism and concurrency as specified by the upcoming C++23 Standard, the C++ Concurrency TS, Parallelism TS V2, data-parallel algorithms, executors, and many more. It also extends the existing C++ Standard APIs to the distributed case (e.g., compute clusters) and for heterogeneous systems (e.g., GPUs).

HPX seamlessly enables a new Asynchronous C++ Standard Programming Model that tends to improve the parallel efficiency of our applications and helps reducing complexities usually associated with parallelism and concurrency.

 

How To Address 7 Major C++ Pain Points with CLion -- Anastasia Kazakiova

Anastasia-200x200.jpgIn the 2023 Annual C++ Developer Survey conducted by the C++ Foundation, the community identified a number of major pain points when working with C++.

How To Address 7 Major C++ Pain Points with CLion

By Anastasia Kazakiova

From the article:

As we’ll discuss in this article, CLion can help C++ developers with most of these in various ways:

  • Managing third-party libraries
  • Improving build times
  • Setting up a CI-pipeline
  • Managing a CMake project
  • Checking code for thread, memory and type safety issues on-the-fly
  • Setting up a development environment from scratch
  • Modernize your code

RFC - fat pointer class, evolution of YOMM2 -- Reddit Q&A

reddit.pngQuestion from reddit poster: I am preparing to release a new feature, a fat pointer class (virtual_ptr), that makes method dispatch even more efficient. Dispatching a method with one virtual argument via a virtual_ptr takes only three instructions and two independent memory reads. As an interesting side-effect, it is now possible to use YOMM2 with non polymorphic classes hierarchies.

RFC - fat pointer class, evolution of YOMM2

From the discussion:

I am preparing to release a new feature, a fat pointer class (virtual_ptr), that makes method dispatch even more efficient. Dispatching a method with one virtual argument via a virtual_ptr takes only three instructions and two independent memory reads. As an interesting side-effect, it is now possible to use YOMM2 with non polymorphic classes hierarchies.

Once I increase the semantic minor version number, I will mostly be stuck with the API. So, if you are interested and in the mood, please review the documentation.

Beyond this, I have been mulling a major version bump. There are a few stuff that are deprecated, and I would like to get rid of them.

Also, I wonder if it would be a good time to switch to C++20. The internals would be a lot simpler and cleaner if I could use concepts.

I have a few major developments on the radar:I have a few major developments on the radar:

  • dispatch on std::any and std::variant
  • "fat" versions of std::any and std::variant (in the manner of virtual_ptr)
  • going headers only
  • related to the former: tunable runtime
  • quasi static initialization of method tables

I wonder if it would be better to wait until these items are completed before switching to C++20 and putting the C++17 code in bugfix only mode.