DEV Community

Cover image for 🚀Announcing conjure_enum - a C++20 enum and typename reflection Library
David Dight
David Dight

Posted on • Edited on

🚀Announcing conjure_enum - a C++20 enum and typename reflection Library

We're pleased to announce the release of conjure_enum, a lightweight header-only C++20 library designed to streamline working with enums and typenames by providing simple reflection capability.

Yes, there is magic_enum - and we based this implementation on the core of magic_enum, but refocused for C++20, using some of the key features of this newer language version such constexpr algorithms, std::source_location, std::to_array and concepts; we also improved and expanded the API.

✨Here's a closer look:

Single Header-Only: No external dependencies, simplifying integration into your project

Modern C++20: Entirely constexpr for compile-time safety, efficiency and performance; no macros

Broad Support: Works with

  • scoped and unscoped enums
  • enum aliases
  • gaps
  • anonymous and named namespaced enums and types

Simple & Easy to Use: Class-based (rather than namespaced) approach with intuitive syntax

Convenient: enum_bitset provides an enhanced enum aware std::bitset

Useful: conjure_type gives you the type string of any typename

Wide Compiler Compatibility: Support for:

  • GCC
  • Clang
  • MSVC
  • XCode/Apple Clang

Testing: Includes comprehensive unit tests for reliable functionality

Expanded: Enhanced API:

  • add_scope
  • remove_scope
  • unscoped_string_to_enum
  • for_each_n
  • dispatch
  • iterators and more!

Transparency: Compiler implementation variability fully documented, verifiable and reportable

Full documentation: with many examples as well as example applications

Summary of main differences, including expanded API.

magic_enum conjure_enum
functions within namespace static methods within class
pure C++20
uses __PRETTY_FUNCTION__ uses std::source_location
transparent compiler specifics
scoped_entries
unscoped_entries
rev_scoped_entries
unscoped_names
remove_scope
add_scope
unscoped_string_to_enum
enum_to_string (noscope option)
for_each_n
dispatch
enum_bitset (string ctor with std::exception, enhanced API)
enum_bitset::for_each
enum_bitset::for_each_n
conjure_type
containers::array
containers::set

Performance test vs magic_enum

We ran the following test case on a Windows 11 ThinkCentre 13th Gen Intel(R) Core(TM) i7-13700, 32Gb; MSVC 2022 / 17.10.5.

int test_magic_enum(std::errc err) { return magic_enum::enum_name(err).size(); }
int test_conjure_enum(std::errc err) { return FIX8::conjure_enum<std::errc>::enum_to_string(err).size(); }
Enter fullscreen mode Exit fullscreen mode

Currently on the dev branch (will be merged to main soon):

Test Timing
std::errc to string (magic_enum) 0.385 sec
std::errc to string (conjure_enum minimal) 0.464 sec

Compile ran three times, avg over 3 runs taken, linker times omitted.

Released under the MIT license.

🔗conjure_enum on github
🔗vcpkg

Top comments (0)