Необходимо быть в состоянии использовать атрибуты StructLayout и FieldOffset для фальсифицирования объединения для простых данных как плавания и ints.
[StructLayout(LayoutKind.Explicit, Size=4)]
private struct IntFloat {
[FieldOffset(0)]
public float floatValue;
[FieldOffset(0)]
public int intValue;
// redundant assignment to avoid any complaints about uninitialized members
IntFloat(int x) {
floatValue = 0;
intValue = x;
}
IntFloat(float x) {
intValue = 0;
floatValue = x;
}
public static explicit operator float (IntFloat x) {
return x.floatValue;
}
public static explicit operator int (IntFloat x) {
return x.intValue;
}
public static explicit operator IntFloat (int i) {
return new IntFloat(i);
}
public static explicit operator IntFloat (float f) {
return new IntFloat(f);
}
}
Тогда переводящий InvSqrt легок.
В C ++ 11 конструкторы с несколькими параметрами могут быть неявно преобразованы в с инициализацией скобок.
Однако до C ++ 11 явный
применялся только к одиночным конструкторы аргументов. Для конструкторов с несколькими аргументами он был проигнорирован, и не оказал никакого влияния .