Не определяйте opCast
для string
, если вы хотите, чтобы ваш тип конвертировался в string
. Вот для чего toString
. writeln
и format
и т. П. Используют toString
, а не приведение или to
, а to
будет использовать toString
, поэтому определенно лучше определить toString
для преобразования в string
. Вы определяете opCast
для преобразования в типы , отличающиеся , чем string
. Тогда вы можете использовать это с кастингом или с to
.
Теперь, если вы хотите преобразовать string
в ваш пользовательский тип, просто определите соответствующий конструктор, и он будет работать с to
.
import std.conv;
struct S
{
int i;
this(string s)
{
i = to!int(s);
}
string toString()
{
return to!string(i);
}
}
void main()
{
auto s = to!S("42");
assert(s.i == 42);
auto t = to!string(s);
assert(t == "42");
}