Template std.conv.to
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.
Arguments
template to(T);
Functions
Function name | Description |
---|---|
to |
Example
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
Converting among numeric types is a safe way to
cast them around.
Conversions from floating-point types to
integral types allow loss of
precision (the fractional part of a floating-point number). The
conversion is truncating towards zero, the same way a cast would
truncate. (To round a floating point value when casting to
an
integral, use roundTo
.)
Examples
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
Conversions from integral types to
floating-point types always
succeed, but might lose accuracy. The largest integers with a
predecessor representable in floating-point format are 2^24-1 for
float, 2^53-1 for double, and 2^64-1 for real (when
real is 80-bit, e.g. on Intel machines).
Example
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!
Conversions from string to
numeric types differ from the C equivalents
atoi() and atol() by checking for overflow and
not allowing whitespace.
For conversion of strings to
signed
types, the grammar recognized is:
Integer: Sign UnsignedInteger UnsignedInteger
Sign: + -
For conversion to
unsigned
types, the grammar recognized is:
UnsignedInteger: DecimalDigit DecimalDigit UnsignedInteger
Converting an array to
another array type works by converting each
element in turn. Associative arrays can be converted to
associative
arrays as long as keys and values can in turn be converted.
Example
int[] a = [1, 2, 3]; 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);
Conversions operate transitively, meaning that they work on arrays and associative arrays of any complexity:
int[string][double[int[]]] a; ... auto b = to!(short[wstring][string[double[]]])(a);
This conversion works because to
!short applies to
an
int, to
!wstring applies to
a string, to
!string applies to
a double, and
to
!(double[]) applies to
an int[]. The
conversion might throw an exception because to
!short
might fail the range check.
Entry point that dispatches to
the appropriate conversion
primitive. Client code normally calls to!TargetType(value)
(and not some variant of
).
toImpl
Authors
Walter Bright, Andrei Alexandrescu, Shin Fujishiro, Adam D. Ruppe, Kenji Hara