-Value ::operator unsigned long long (void) const { assert(0); return 0; }
-Null ::operator unsigned long long (void) const { return 0; }
-Bool ::operator unsigned long long (void) const { return static_cast<unsigned long long>(value); }
-SInt ::operator unsigned long long (void) const { assert(value >= 0); return static_cast<signed long long>(value); }
-UInt ::operator unsigned long long (void) const { return value; }
-Float ::operator unsigned long long (void) const { return static_cast<unsigned long long>(value); }
-Enum ::operator unsigned long long (void) const { return static_cast<unsigned long long>(*sig->second); }
+unsigned long long Value ::toUInt(void) const { assert(0); return 0; }
+unsigned long long Null ::toUInt(void) const { return 0; }
+unsigned long long Bool ::toUInt(void) const { return static_cast<unsigned long long>(value); }
+unsigned long long SInt ::toUInt(void) const { assert(value >= 0); return static_cast<signed long long>(value); }
+unsigned long long UInt ::toUInt(void) const { return value; }
+unsigned long long Float ::toUInt(void) const { return static_cast<unsigned long long>(value); }
+unsigned long long Enum ::toUInt(void) const { assert(sig->value >= 0); return sig->value; }
+
+
+// floating point cast
+float Value ::toFloat(void) const { assert(0); return 0; }
+float Null ::toFloat(void) const { return 0; }
+float Bool ::toFloat(void) const { return static_cast<float>(value); }
+float SInt ::toFloat(void) const { return static_cast<float>(value); }
+float UInt ::toFloat(void) const { return static_cast<float>(value); }
+float Float ::toFloat(void) const { return value; }
+float Enum ::toFloat(void) const { return static_cast<float>(sig->value); }