Два разных экземпляра одного и того же шаблона не имеют ничего общего, кроме двух совершенно разных типов в том, что касается компилятора. Вы можете объявить
struct VectorFloat
{
...
}
struct VectorDouble
{
...
}
вместо шаблонизации Vector2
, и это не имеет значения. Vector2!float
и Vector!double
- это совершенно разные типы. И с любыми типами, которые вы объявляете, если вам нужны способы конвертации между ними, вам придется объявлять их - будь то opCast
, alias this
, конструкторы или что-то еще. Я полагаю, что единственный способ получить неявное преобразование в работу - это alias this
, хотя, как указывает ratchet freak , неявное преобразование между числами с плавающей запятой и двойными числами - это не как обычно работает D и, возможно, это плохая идея.
Относительно того, почему A быстрее, чем B, я не знаю. Я бы на самом деле ожидал, что все будет наоборот. Но в зависимости от того, что именно делает компилятор, он может измениться позже и может легко варьироваться от компилятора к компилятору. И поскольку вы видите разницу только в 50 мс за 10 миллионов итераций, я бы выбрал версию, которая имеет больше смысла с точки зрения API (в зависимости от того, что вы думаете). Хотя я бы поспорил с первым, просто потому, что не думаю, что это хорошая идея для неявного преобразования между float и double, но это зависит от вас, так как это ваш код.
Кстати, вы можете использовать std.conv.to вместо прямого вызова opCast
, если хотите. Это менее подвержено ошибкам, так как с тех пор вы будете кричать, если вы испортите определение opCast
, в то время как компилятор, скорее всего, все равно просто сделает это, поскольку приведение очень тупой инструмент.