+ virtual ~Value() {}
+ virtual void visit(Visitor &visitor) = 0;
+
+ virtual operator bool (void) const = 0;
+ virtual operator signed long long (void) const;
+ virtual operator unsigned long long (void) const;
+ virtual operator double (void) const;
+
+ virtual void *blob(void) const;
+ const char *string(void) const;
+
+ inline operator signed char (void) const {
+ return static_cast<signed long long>(*this);
+ }
+
+ inline operator unsigned char (void) const {
+ return static_cast<signed long long>(*this);
+ }
+
+ inline operator signed short (void) const {
+ return static_cast<signed long long>(*this);
+ }
+
+ inline operator unsigned short (void) const {
+ return static_cast<unsigned long long>(*this);
+ }
+
+ inline operator signed (void) const {
+ return static_cast<signed long long>(*this);
+ }
+
+ inline operator unsigned (void) const {
+ return static_cast<unsigned long long>(*this);
+ }
+
+ inline operator signed long (void) const {
+ return static_cast<signed long long>(*this);
+ }
+
+ inline operator unsigned long (void) const {
+ return static_cast<unsigned long long>(*this);
+ }
+
+ inline operator float (void) const {
+ return static_cast<double>(*this);
+ }
+
+ const Value & operator[](size_t index) const;