* Add ranges * Initial Hugo setup * Work in progress * Added selection for local or remote site * Updated to 'light' theme * Changed to using Hextra Hugo theme * Changed to using Hextra Hugo theme * Changed to Hextra Hugo theme * Change to Hextra Hugo theme * Updated Hugo setup. * Updated Hugo setup. # Conflicts: # docs/releases/_index.md * Work in progress * Added new fonts Added new documentation * Latest documentation updates * Latest documentation updates # Conflicts: # docs/containers/array.md # docs/containers/array_view.md # docs/containers/array_wrapper.md # docs/containers/bip_buffer_spsc_atomic.md # docs/containers/bitset.md # docs/containers/indirect_vector.md # docs/containers/vector.md # docs/getting-started/compilers.md * Added bloom_filter markdown doc * Added more documentation Updated CSS for light and dark modes * Fixed some menus Added mode documentation files * Updated CSS rules Added badges to home page Added uniqur_ptr + pool tutorial * Fixed formatting on the home page markdown Modified light amd dark code formatting * Updated unique_ptr-with-pool * Added container and shared message tutorials * Updates to documentation * Added const_multimap * Updated source-formatting.md * Added initial raw text files form Web site editor * Innore coverage build directory * Exported raw text documentation files from the web site editor * Hugo updates * Added Hugo intalation and markdown descriptions * More addition to the documentation * Added closure.md and updates to delegate.md * Added format.md * Added documentation for etl::delegate_observable, etl::function, Base64 codec * Added io_port documentation * Added basic_format_spec * Added documentation for string_stream and string utilities. * Added more documentation Updated the documentation CSS * Added documentation for clocks, day, duration * Added more documentation for chrono classes Updated callouts * More chrono documentation * Completed chrono documentation * Maths functions documentation * Completed maths documentation * Completed maths documentation * Completed maths documentation * Completed maths documentation * Added multiple documentation files * Added iterator.md * Added debug_count.md and versions.md * Added debug_count.md and versions.md * Added more documentation * More documentation * Added some design pattern documentation Modified some of the layout files Modified the About documentation * Converted more documentation pages Modified the site CSS * Added more documentation Moced some documentation files to new directories * Added more documentation Tweaks to CSS * Added callback_timer_deferred_locked documentation * Added callback_timer_locked documentation * More documentation updates * More documentation updates * More documentation updates * New documentation files. Harmonised file name format * New documentation files. * Multiple document updates * Multiple document updates * Final conversion of web pages * Updates before PR * Updates before PR * Updates before PR # Conflicts: # docs/blog/_index.md * Final pre PR updates * Updates to message framework documentation * Renamed directory * Fix spelling * Added author and date to blog files Moved documentation files merged from development * Fixed 'Description' typo * Fix typos # Conflicts: # docs/IO/io_port.md # docs/containers/sets/const-multiset.md # docs/containers/sets/const-set.md # docs/maths/correlation.md # docs/maths/gamma.md * Renamed two files to lower case * Minor renaming * Added author and date * Updated callout on bresenham_line.md Added support for showing the ETL version on the documentation first page, by copying the version.txt file as a hugo asset. Updated the Python 'update_release.py' to copy 'version.txt' * Replace space in filename with hyphen. Added more information to hugo-commands.md * Replace space in filename with hyphen. Added more information to hugo-commands.md # Conflicts: # docs/getting-started/view-the-docs-locally/hugo-commands.md * Added a link to pseudo_moving_average.md * Updated title pages for groups * Fixed missing 404 for non-existent pages * Fixed coordinate variable names in the 'Calculating the intersection' example --------- Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de> Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com> Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk>
3.7 KiB
| title |
|---|
| type_id |
{{< callout type="info">}}
Header: type_id.h
Since: TBC
{{< /callout >}}
Below is a concise, technical overview of the etl::type_id facility, suitable for design documentation or code review context.
Overview:
etl::type_id is a lightweight, RTTI-free mechanism for uniquely identifying C++ types at runtime. It is designed for environments where standard RTTI (typeid, std::type_info) is unavailable, undesirable, or too costly—such as embedded systems or performance-constrained platforms.
The implementation guarantees uniqueness per type within a program image while remaining constexpr-friendly and requiring no dynamic allocation.
Design Concept
The core idea is to associate each distinct type T with the address of a unique static object. That address serves as the type’s identifier.
This is achieved through:
template <typename T>
struct type_id_anchor
{
static char value;
};
Each instantiation of type_id_anchor<T> owns its own static char value, and the address of that variable is guaranteed to be unique for each distinct T. The address is stable for the lifetime of the program.
Key Components
Type Normalization
When requesting a type ID via type_id::get<T>(), the type is first normalised:
using type = typename etl::remove_cvref<T>::type;
This ensures that:
T,const T,T&, andT&&all map to the sametype_id- Only the underlying type identity matters
Type ID Generation
template <typename T>
static ETL_CONSTEXPR type_id get() ETL_NOEXCEPT;
- Returns a
type_idthat uniquely representsT - Internally stores the address of
type_id_anchor<T>::value - Requires no RTTI, no dynamic memory, and no runtime registration
Invalid Type ID
static ETL_CONSTEXPR type_id invalid_id() ETL_NOEXCEPT;
- Represents an invalid or uninitialised type ID
- Implemented as a null pointer (
id == nullptr) - Default constructor produces this state
type_id Class Semantics
Storage
const void* id;
- The identifier is stored as a pointer
- Comparison is purely pointer comparison (fast and deterministic)
Supported Operations
| Operation | Behavior |
|---|---|
Equality (==) |
True if both type IDs refer to the same type |
Inequality (!=) |
Logical negation of equality |
Ordering (<) |
Pointer comparison (useful for ordered containers) |
| Boolean conversion | true if valid, false if invalid |
| Integer conversion | Explicit conversion to intptr_t / uintptr_t |
Copy and Assignment
- Copyable and assignable
- Copy semantics preserve identity (pointer value)
Guarantees and Properties
- Uniqueness: Each distinct type has exactly one unique
type_id - Stability: Type IDs remain valid for the entire program lifetime
- Zero overhead: No dynamic allocation, no lookup tables
- RTTI-free: Suitable for builds with RTTI disabled
- Comparable: Can be used as keys in associative containers
Typical Use Cases
- Type-safe containers (e.g., variant, any, message buses)
- Plugin or component systems
- Compile-time / runtime type discrimination in embedded systems
- Replacement for
std::type_indexin restricted environments
Summary
etl::type_id provides a robust, minimal, and efficient alternative to C++ RTTI by encoding type identity as the address of a unique static object. Its design is particularly well-suited to embedded and low-level systems where determinism, performance, and binary size are critical.