Poco

class DynamicAny

Library: Foundation
Package: Core
Header: Poco/DynamicAny.h

Description

DynamicAny allows to store data of different types and to convert between these types transparently. DynamicAny puts forth the best effort to provide intuitive and reasonable conversion semantics and prevent unexpected data loss, particularly when performing narrowing or signedness conversions of numeric data types.

Loss of signedness is not allowed for numeric values. This means that if an attempt is made to convert the internal value which is a negative signed integer to an unsigned integer type storage, a RangeException is thrown. Overflow is not allowed, so if the internal value is a larger number than the target numeric type size can accomodate, a RangeException is thrown.

Precision loss, such as in conversion from floating-point types to integers or from double to float on platforms where they differ in size (provided internal actual value fits in float min/max range), is allowed.

String truncation is allowed — it is possible to convert between string and character when string length is greater than 1. An empty string gets converted to the char '\0', a non-empty string is truncated to the first character.

Bolean conversion are performed as follows:

A string value "false" (not case sensitive) or "0" can be converted to a boolean value false, any other string not being false by the above criteria evaluates to true (e.g: "hi" -> true). Integer 0 values are false, everything else is true. Floating point values equal to the minimal FP representation on a given platform are false, everything else is true.

A DynamicAny can be created from and converted to a value of any type for which a specialization of DynamicAnyHolderImpl is available. For supported types, see DynamicAnyHolder documentation.

Member Summary

Member Functions: convert, extract, operator, operator !=, operator =, operator T, swap, type

Constructors

DynamicAny

DynamicAny();

Creates a DynamicAny holding an int with value 0.

DynamicAny inline

template < typename T > DynamicAny(
    const T & val
);

Creates the DynamicAny from the given value.

DynamicAny

DynamicAny(
    const char * pVal
);

DynamicAny

DynamicAny(
    const DynamicAny & other
);

Copy constructor.

Destructor

~DynamicAny

~DynamicAny();

Destroys the DynamicAny.

Member Functions

convert inline

template < typename T > void convert(
    T & val
) const;

Invoke this method to perform a safe conversion.

Example usage:

DynamicAny any("42");
int i;
any.convert(i);

Throws a RangeException if the value does not fit into the result variable. Throws a NotImplementedException if conversion is not available for the given type.

convert inline

template < typename T > T convert() const;

Invoke this method to perform a safe conversion.

Example usage:

DynamicAny any("42");
int i = any.convert<int>();

Throws a RangeException if the value does not fit into the result variable. Throws a NotImplementedException if conversion is not available for the given type.

extract inline

template < typename T > const T & extract() const;

Returns a const reference to the actual value.

Must be instantiated with the exact type of the stored value, otherwise a BadCastException is thrown.

operator inline

template < typename T > bool operator == (
    const T & other
);

Equality operator

operator inline

bool operator == (
    const char * other
);

Equality operator

operator != inline

template < typename T > bool operator != (
    const T & other
);

Inequality operator

operator != inline

bool operator != (
    const char * other
);

Inequality operator

operator = inline

DynamicAny & operator = (
    const DynamicAny & other
);

Assignment operator

operator = inline

template < typename T > DynamicAny & operator = (
    const T & other
);

Assignment operator

operator T inline

template < typename T > operator T() const;

Safe conversion operator for implicit type conversions.

Throws a RangeException if the value does not fit into the result variable. Throws a NotImplementedException if conversion is not available for the given type.

swap

void swap(
    DynamicAny & other
);

Swaps the content of the this DynamicAny with the other DynamicAny.

type

const std::type_info & type() const;

Returns the type information of the stored content.