aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md24
1 files changed, 12 insertions, 12 deletions
diff --git a/README.md b/README.md
index 9f9efe1..f2c55e1 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
* Convert any integral type to a string at compile-time
* Supports converting to any base between 2 and 36 inclusive
* No external dependencies, only includes `type_traits` for template parameter checking
-* Works best in C++20 GCC or C++17/20 Clang
+* Supports custom character types, e.g. `to_string<123, 10, wchar_t>`
**How to use:**
@@ -22,31 +22,31 @@ With `to_string`, all that will be found in program disassembly are the resultin
Try it [on Compiler Explorer](https://godbolt.org/z/T-MFoh).
-**Known issues:**
-
-* With C++17 GCC, `to_string` must be used to initialize variables; otherwise, the integer-string conversion is done at run-time.
-
# How it works
The basic structure of `to_string` is shown below:
```cpp
-template<auto N, unsigned int base, /* N type-check and base bounds-check */>
+template<auto N, unsigned int base, typename char_type, /* N type-check and base bounds-check */>
struct to_string_t {
- char buf[]; // Size selection explained later.
- constexpr to_string_t() {} // Converts the integer to a string stored in buf.
- constexpr operator char *() {} // These allow for the object to be implicitly converted
- constexpr operator const char *() {} // to a character pointer.
+ char_type buf[]; // Size selection explained later.
+ constexpr to_string_t() {} // Converts the integer to a string stored in buf.
+ constexpr operator char_type *() {} // These allow for the object to be implicitly converted
+ constexpr operator const char_type *() {} // to a character pointer.
+
+ // begin() and end() are supported too.
};
-template<auto N, unsigned int base = 10>
-to_string_t<N, base> to_string; // Simplifies usage: to_string_t<N, base>() becomes to_string<N, base>.
+template<auto N, unsigned int base = 10, typename char_type = char>
+constexpr to_string_t<N, base, char_type> to_string; // Simplifies usage, e.g. to_string_t<367>() becomes to_string<367>.
```
Since the number and base are template parameters, each differing `to_string` use will get its own character buffer.
The integer/string conversion is done using a simple method I learned over the years, where the string is built in reverse using `n % base` to calculate the value of the lowest digit:
+(*Note: The below examples of code are not up-to-date, though they still give a general idea of how `to_string` works.*)
+
```cpp
constexpr to_string_t() {
auto ptr = buf + sizeof(buf) / sizeof(buf[0]);