A one-stop shop for converting values from one type to another.
Thrown on conversion errors.
Thrown on conversion overflow errors.
The to family of functions converts a value from type Source to type Target. The source type is deduced and the target type must be specified, for example the expression to!int(42.0) converts the number 42 from double to int. The conversion is "safe", i.e., it checks for overflow; to!int(4.2e10) would throw the ConvOverflowException exception. Overflow checks are only inserted when necessary, e.g., to!double(42) does not do any checking because any int fits in a double.
Converting a value to its own type (useful mostly for generic code) simply returns its argument.
int a = 42; auto b = to!int(a); // b is int with value 42 auto c = to!double(3.14); // c is double with value 3.14
int a = 420; auto b = to!long(a); // same as long b = a; auto c = to!byte(a / 10); // fine, c = 42 auto d = to!byte(a); // throw ConvOverflowException double e = 4.2e6; auto f = to!int(e); // f == 4200000 e = -3.14; auto g = to!uint(e); // fails: floating-to-integral negative overflow e = 3.14; auto h = to!uint(e); // h = 3 e = 3.99; h = to!uint(a); // h = 3 e = -3.99; f = to!int(a); // f = -3
int a = 16_777_215; // 2^24 - 1, largest proper integer representable as float assert(to!int(to!float(a)) == a); assert(to!int(to!float(-a)) == -a); a += 2; assert(to!int(to!float(a)) == a); // fails!
Integer: Sign UnsignedInteger UnsignedInteger Sign: + -
UnsignedInteger: DecimalDigit DecimalDigit UnsignedInteger
int[] a = ([1, 2, 3]).dup; auto b = to!(float[])(a); assert(b == [1.0f, 2, 3]); string str = "1 2 3 4 5 6"; auto numbers = to!(double[])(split(str)); assert(numbers == [1.0, 2, 3, 4, 5, 6]); int[string] c; c["a"] = 1; c["b"] = 2; auto d = to!(double[wstring])(c); assert(d["a"w] == 1 && d["b"w] == 2);
int[string][double[int[]]] a; ... auto b = to!(short[wstring][string[double[]]])(a);
If the source type is implicitly convertible to the target type, to simply performs the implicit conversion.
When source type supports member template function opCast, is is used.
When target type supports 'converting construction', it is used.
Object-to-object conversions by dynamic casting throw exception when the source is non-null and the target is null.
Stringize conversion from all types is supported.
Narrowing numeric-numeric conversions throw when the value does not fit in the narrower type.
Array-to-array conversion (except when target is a string type) converts each element in turn by using to.
Associative array to associative array conversion converts each key and each value in turn.
String to non-string conversion runs parsing.
Convert a value that is implicitly convertible to the enum base type into an Enum value. If the value does not match any enum member values a ConvException is thrown. Enums with floating-point or string base types are not supported.
Rounded conversion from floating point to integral.
assert(roundTo!int(3.14) == 3); assert(roundTo!int(3.49) == 3); assert(roundTo!int(3.5) == 4); assert(roundTo!int(3.999) == 4); assert(roundTo!int(-3.14) == -3); assert(roundTo!int(-3.49) == -3); assert(roundTo!int(-3.5) == -4); assert(roundTo!int(-3.999) == -4);Rounded conversions do not work with non-integral target types.
The parse family of functions works quite like the to family, except that (1) it only works with character ranges as input, (2) takes the input by reference and advances it to the position following the conversion, and (3) does not throw if it could not convert the entire input. It still throws if an overflow occurred during conversion or if no character of the input was meaningfully converted.
string test = "123 \t 76.14"; auto a = parse!uint(test); assert(a == 123); assert(test == " \t 76.14"); // parse bumps string munch(test, " \t\n\r"); // skip ws assert(test == "76.14"); auto b = parse!double(test); assert(b == 76.14); assert(test == "");
Parsing one character off a string returns the character and bumps the string up one position.
Parses an array from a string given the left bracket (default '['), right bracket (default ']'), and element separator (by default ',').
Parses an associative array from a string given the left bracket (default '['), right bracket (default ']'), key-value separator (default ':'), and element seprator (by default ',').
Convenience functions for converting any number and types of arguments into text (the three character widths).
The octal facility is intended as an experimental facility to replace octal literals starting with '0', which many find confusing. Using octal!177 or octal!"177" instead of 0177 as an octal literal makes code clearer and the intent more visible. If use of this facility becomes preponderent, a future version of the language may deem old-style octal literals deprecated.
The rules for strings are the usual for literals: If it can fit in an int, it is an int. Otherwise, it is a long. But, if the user specifically asks for a long with the L suffix, always give the long. Give an unsigned iff it is asked for with the U or u suffix. Octals created from integers preserve the type of the passed-in integral.
// same as 0177 auto x = octal!177; // octal is a compile-time device enum y = octal!160; // Create an unsigned octal auto z = octal!"1_000_000u";
Given a pointer chunk to uninitialized memory (but already typed as T), constructs an object of non-class type T at that address.
Given a pointer chunk to uninitialized memory (but already typed as a non-class type T), constructs an object of type T at that address from arguments args.
This function can be @trusted if the corresponding constructor of T is @safe.
Given a raw memory area chunk, constructs an object of class type T at that address. The constructor is passed the arguments Args. The chunk must be as least as large as T needs and should have an alignment multiple of T's alignment. (The size of a class instance is obtained by using _traits(classInstanceSize, T)).
This function can be @trusted if the corresponding constructor of T is @safe.
Given a raw memory area chunk, constructs an object of non-class type T at that address. The constructor is passed the arguments args, if any. The chunk must be as least as large as T needs and should have an alignment multiple of T's alignment.
This function can be @trusted if the corresponding constructor of T is @safe.
Returns the corresponding unsigned value for x (e.g. if x has type int, it returns cast(uint) x). The advantage compared to the cast is that you do not need to rewrite the cast if x later changes type (e.g from int to long).
Note that the result is always mutable even if the original type was const or immutable. In order to retain the constness, use std.traits.Unsigned.
uint s = 42; auto u1 = unsigned(s); //not qualified Unsigned!(typeof(s)) u2 = unsigned(s); //same qualification immutable u3 = unsigned(s); //totally qualified
Returns the corresponding signed value for x (e.g. if x has type uint, it returns cast(int) x). The advantage compared to the cast is that you do not need to rewrite the cast if x later changes type (e.g from uint to ulong).
Note that the result is always mutable even if the original type was const or immutable. In order to retain the constness, use std.traits.Signed.
uint u = 42; auto s1 = unsigned(u); //not qualified Unsigned!(typeof(u)) s2 = unsigned(u); //same qualification immutable s3 = unsigned(u); //totally qualified