Using Variant to Store Point
Variant is a very powerful data type to store 'any' data. With the help of COM class _variant_t, VARIANT bacomes very easy to use. But _variant_t dosen't support all kinds of data type, for example, point data with two or three elements. Variant can hold pointer, but the memory management becomes a stubborn problem when copying variant. I'm trying to find a better way to solve the problem, but I don't want to rewrite a variant. So, dose the way exist?
Many UI-libs use variant to hold data of properties, such as BCGPControlBar, and they do support point displaying. Actually the point elements are formated to a string so that they be stored into one property. But it's very boring to parse values between points and variant, so it's a good idea to write a adapter for them. This adapter takes charge to format point data to string, extract point data from string, and ex-convert with _variant_t.
if we have a point class like this:
class
Point3D
{
public
:
Point3D()
{}
Point3D(
double
x,
double
y,
double
z);
double
x();
double
y();
double
z();
private
:
double
x, y, z;
}
;
we can write our point adapter as following:
class
PointAdapter
{
private
:
CString m_strData;
public
:
PointAdapter();
PointAdapter(
const
Point3D
&
point);
PointAdapter(
const
_variant_t
&
point);
operator
Point3D()
const
;
operator
_variant_t()
const
;
}
;
now, we can use the classes:
Point3D point(
1
,
2
,
3
);
_variant_t var
=
PointAdapter(point);
Point3D point2
=
PointAdapter(var);