Conversion between string types



 DEVELOP > c-Plus-Plus > Conversion between string types

LINK TO THIS PAGE  


rating :  0   |  0


  Page 1 of 1

1

 
Topic: DEVELOP > c-Plus-Plus
User: "Thomas Matthews"
Date: 24 Feb 2004 12:12:40 PM
Object: Conversion between string types
Hi,
I'm working with Borland C++ Builder 6.2.
My project uses the std::string class. However, Borland in
its infinite wisdom has its own string class, AnsiString.
To make my life easier, I want to create a function,
preferably a conversion operator, to convert from a
std::string to an AnsiString. Please note that I don't
want to change either std::string or AnsiString.
The Background
--------------
In using Borland's Database Engine (BDE), there is
a variant type "TVariant" which it uses for its
field types. The TVariant is a union:
class TVarRec
{
public:
union
{
Integer VInteger;
Boolean VBoolean;
Char VChar;
PExtended VExtended;
PShortString VString;
Pointer VPointer;
PChar VPChar;
TObject* VObject;
TClass VClass;
WideChar VWideChar;
PWideChar VPWideChar;
Pointer VAnsiString;
PCurrency VCurrency;
PVariant VVariant;
};
union
{
Byte VType;
};
};
I'm writing my own generic wrapper for fields,
and I have a function to fill in a TVarRec
variable:
class Field
{
public:
virtual void fill_variant(TVarRec * pv) const = 0;
};
class Integer_Field
: public Field
{
int value;
public:
virtual void fill_variant(TVarRec * p_variant) const
{*p_variant = value;}
};
So far, so good (I hope). Now I'm trying to make
a templated field class. The issue is that TVarRec
has no assignment for std::string, but for AnsiString.
Which means that I need a conversion for the
fill_variant method:
class String_Field
: public Field
{
std::string value;
public:
virtual void fill_variant(TVarRec * p_variant) const
{*p_variant = AnsiString(value.c_str());}
// The AnsiString type has constructor for C style strings.
};
When I convert String_Field to use a template, the content
of the fill_variant method differs from the Integer field.
template <typename Field_Value>
class Typed_Field
: public Field
{
Field_Value value;
public:
virtual void fill_variant(TVarRec * p_variant) const
{*p_variant = value;}
};
The thorn in this design is that Typed_Field<std::string>
causes an error because there is no std::string type
defined in the TVarRec. The PShortString type will
convert from an AnsiString type though.
I have other cases where I am having to convert from
a std::string type to an AnsiString type (such as all
the windowing APIs). This is where a global conversion
function would come in handy. The function would be
really handy if it could be implicit so I don't have
to write something like:
edit_box.Text = AnsiStringFromSTLString(s);
I'd rather write:
string hello("hello");
edit_box.Text = hello; // Implied conversion
Any ideas?
BTW, this is not off-topic, as I am searching for
a conversion operator between types; regardless
of whether the types are STL, C++ runtime or
external libraries.
--
Thomas Matthews
C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book
.

User: "Victor Bazarov"

Title: Re: Conversion between string types 24 Feb 2004 10:52:26 PM
"Thomas Matthews" <Thomas_MatthewsSpitsOnSpamBots@sbcglobal.net> wrote...

My project uses the std::string class. However, Borland in
its infinite wisdom has its own string class, AnsiString.

To make my life easier, I want to create a function,
preferably a conversion operator, to convert from a
std::string to an AnsiString. Please note that I don't
want to change either std::string or AnsiString.
[...]
I have other cases where I am having to convert from
a std::string type to an AnsiString type (such as all
the windowing APIs). This is where a global conversion
function would come in handy. The function would be
really handy if it could be implicit so I don't have
to write something like:
edit_box.Text = AnsiStringFromSTLString(s);
I'd rather write:
string hello("hello");
edit_box.Text = hello; // Implied conversion

Any ideas?

An assignment operator cannot be anything else but a non-static
member. You already know that (hopefully). Type conversion
operators cannot be anything but non-static members. So, you
are pretty much screwed in that regard if you don't want to muck
with either class. What you did is basically the only path you
can take, I think.
Victor
.
User: "Thomas Matthews"

Title: Re: Conversion between string types 25 Feb 2004 08:18:36 AM
Victor Bazarov wrote:

"Thomas Matthews" <Thomas_MatthewsSpitsOnSpamBots@sbcglobal.net> wrote...

My project uses the std::string class. However, Borland in
its infinite wisdom has its own string class, AnsiString.

To make my life easier, I want to create a function,
preferably a conversion operator, to convert from a
std::string to an AnsiString. Please note that I don't
want to change either std::string or AnsiString.
[...]
I have other cases where I am having to convert from
a std::string type to an AnsiString type (such as all
the windowing APIs). This is where a global conversion
function would come in handy. The function would be
really handy if it could be implicit so I don't have
to write something like:
edit_box.Text = AnsiStringFromSTLString(s);
I'd rather write:
string hello("hello");
edit_box.Text = hello; // Implied conversion

Any ideas?



An assignment operator cannot be anything else but a non-static
member. You already know that (hopefully). Type conversion
operators cannot be anything but non-static members. So, you
are pretty much screwed in that regard if you don't want to muck
with either class. What you did is basically the only path you
can take, I think.

Victor


Thanks Victor. I had a gut feeling that I was screwed.
I can create a template function and overloaded functions
to help me out:
void AssignToVarRec(const std::string& s,
TVarRec * p_varrec)
{
*p_varrec = AnsiString(s.c_str());
return;
}
template <typename T>
void AssignToVarRec(const T& value,
TVarRec * p_varrec)
{
*p_varrec = value;
return;
}
So all I have to do is change my assignment operators
to use AssignToVarRec. A bit more complicated, but it
will work.
--
Thomas Matthews
C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book
.



  Page 1 of 1

1

 


Related Articles
 

NEWER

pg.1232     pg.940     pg.716     pg.544     pg.412     pg.311     pg.234     pg.175     pg.130     pg.96     pg.70     pg.50     pg.35     pg.24     pg.16     pg.10     pg.6     pg.3     pg.1

OLDER