The conversion module provides fast, explicit, and allocation-aware helpers to convert strings to typed values and typed values to strings in C++.
It is designed as a low-level building block for:
- parsers
- configuration systems
- CLI tools
- HTTP APIs
- validation pipelines (used by
vix::validation)
The module favors predictability, performance, and explicit error handling.
Conversion in Vix follows strict rules:
- No exceptions
- No implicit conversions
- No locale dependence
- No iostreams
- Precise error reporting (code, position, input)
Every conversion returns an expected<T, ConversionError>.
| Concept | Purpose |
|---|---|
to_int<T> |
Parse integer from string |
to_float<T> |
Parse floating point from string |
to_bool |
Parse boolean values |
to_enum<T> |
Parse enum using explicit mapping |
parse<T> |
Generic typed parsing facade |
to_string |
Convert values to string |
ConversionError |
Structured conversion error |
expected<T,E> |
Explicit success / failure |
All conversions return:
expected<T, ConversionError>Where ConversionError contains:
code— semantic error codeposition— error index in inputinput— original input
Example:
static void print_err(const ConversionError &e)
{
std::cout << "error: " << to_string(e.code)
<< " position=" << e.position
<< " input='" << e.input << "'\n";
}#include <vix/conversion/ToInt.hpp>
auto r = to_int<int>(" -42 ");
if (!r)
{
// handle r.error()
}
else
{
int value = r.value();
}Examples:
examples/parse_int.cppexamples/parse_generic.cpp
#include <vix/conversion/ToFloat.hpp>
auto r = to_float<double>(" 3.14 ");Supports:
- scientific notation
- leading / trailing spaces
Examples:
examples/parse_float.cpp
Accepted values (case-insensitive):
true,false1,0yes,noon,off
#include <vix/conversion/ToBool.hpp>
auto r = to_bool("yes");Examples:
examples/parse_bool.cpp
Enums are parsed using an explicit mapping table.
enum class Role { Admin, User };
static constexpr EnumEntry<Role> roles[] = {
{"admin", Role::Admin},
{"user", Role::User},
};
auto r = to_enum<Role>("ADMIN", roles); // case-insensitiveExamples:
examples/parse_enum.cpp
parse<T> automatically selects the correct converter.
#include <vix/conversion/Parse.hpp>
auto a = parse<int>("42");
auto b = parse<double>("3.14");
auto c = parse<bool>("true");Examples:
examples/parse_generic.cpp
#include <vix/conversion/ToString.hpp>
auto a = to_string(42);
auto b = to_string(3.14);
auto c = to_string(true);Enums require a mapping table:
auto r = to_string(Role::Admin, roles);Examples:
examples/to_string.cpp
- Uses
std::from_chars/std::to_chars - No heap allocations in parsing paths
- Stack buffers only
- Locale-independent
This makes the module suitable for hot paths and low-latency systems.
Unit tests are located in tests/:
to_int_smoke.cppto_float_smoke.cppto_bool_smoke.cppto_enum_smoke.cpp
Run:
ctestThe conversion module is the foundation of vix::validation:
ParsedValidator<T>relies onparse<T>- Form binding depends on conversion error reporting
- Errors propagate without loss of information
- Explicit over implicit
- Errors as values
- No runtime surprises
- Easy to embed
- Predictable behavior
MIT Part of the Vix.cpp project.