Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   extending std::string (http://www.velocityreviews.com/forums/t719891-extending-std-string.html)

Lars Schouw 04-07-2010 07:11 PM

extending std::string
 
How can I extend the std::string class to become more cleaver with
regards to regexp build right into my extended string class?

* I am not allowed to derive from std::string since there is no
virtual destructor.
* I don't want to aggregate the std:string as a private member
variable since I need to expose all it's methods and maintain changes
in the future of the std standard.
* I could have an extra util file that where all the functions takes
in the std::string as the first agument but this would not be as
elegant.

I know this has been discussed before but just wanted to see if anyone
has any new ideas.

Lars

Kai-Uwe Bux 04-07-2010 07:21 PM

Re: extending std::string
 
Lars Schouw wrote:

> How can I extend the std::string class to become more cleaver with
> regards to regexp build right into my extended string class?
>
> * I am not allowed to derive from std::string since there is no
> virtual destructor.


Uhm, in itself that should not stop you. There are other classes, like
std::iterator or std::binary_predicate clearly meant to be derived from that
lack virtual destructors.

> * I don't want to aggregate the std:string as a private member
> variable since I need to expose all it's methods and maintain changes
> in the future of the std standard.


Then, public derivation seems to be your friend. But there are some gotchas.
You could also consider private derivation, which does require some using
directives for forwarding. These, of course, would need to be updated with
any change in the string class.

> * I could have an extra util file that where all the functions takes
> in the std::string as the first agument but this would not be as
> elegant.


Why not? To me, it appears that regular expressions are orthogonal to
strings. In fact, I would picture a regexp class that can operate (determine
matches, ...) on _any_ sequence of chars: std::string, std::vector< char >,
std::deque< char >, ... I would assume that such a regexp class has member
function templates like

template < typename Char >
class regexp {

...

template < typename CharIter >
bool match ( CharIter from, CharIter to );

template < typename CharIter >
CharIter first_match ( CharIter from, CharIter to );

};


Best

Kai-Uwe Bux

tonydee 04-08-2010 01:52 AM

Re: extending std::string
 
On Apr 8, 4:11*am, Lars Schouw <schou...@yahoo.com> wrote:
> How can I extend the std::string class to become more cleaver with
> regards to regexp build right into my extended string class?
>
> * I am not allowed to derive from std::string since there is no
> virtual destructor.


As mentioned by Christian, this isn't a show stopper.

> * I don't want to aggregate the std:string as a private member
> variable since I need to expose all it's methods and maintain changes
> in the future of the std standard.


Understandable.

> * I could have an extra util file that where all the functions takes
> in the std::string as the first agument but this would not be as
> elegant.


In terms of elegance, can you show us what usage you're trying to
achieve? How it'd be "better" than boost::regex and std::string? I
need to see that before the implementation implications are obvious
enough that I might offer concrete advice. For now, I guess you want
a variant that can be in string or regexp state, but how will you
specify which type it should be in constructors and especially
operator=? What happens if people try to insert/replace etc. in a
regexp: will you recompile the regexp each time, or lazily on first
use? There are lots of implementation questions and the usage and
consequences may be hard to keep consistent, let alone test and
document and train people in. I suspect that when you get into this
you'll find separate classes is cleaner and reliable than a fat
interface merging concepts of both....

Cheers,
Tony

Lars Schouw 04-08-2010 08:29 AM

Re: extending std::string
 
I understand it is very difficult to extend stl since it is elegantly
designed to be used with containers and algoritms.

Acually what I am trying to do it mimic powerful VBA string
functionallity, which C++ seems to be missing out of the box.

Here is a list of requirements:

A) The VBA method Like can be done using regexp. regexp is part of C++
0X (TR1)

B) Tokenize a string easily. Split stings by chars or string
delimiters. Split stings in fixed sizes.

C) trim strings trailing and ending of whitespaces and also strip
strings of whitespaces

D) Compare string case insensitive

E) IsNumeric and IsAlphanumeric, determin if a string is numeric (0-9)
or alphanumeric (a-z, A-Z and 0-9)

F) Convert from string to bool, double, long or date

G) Rounding of numbers in strings

H) Easily handle pascal and C strings

I) Ideally be able to stored in a stl container

J) join a N strings into one.

K) Repeate a string N times.

L) convert strings to lower or upper case

M) Find out if a string is lower or upper case

N) swap lower and upper case.

Keenan Tims seems to have done a number of them already
http://www.gotroot.ca/ext_string/

I am not such a big fan of your do all functions that just encapsulate
the helper functions, need to think a little.
Maybe we should just do regexp everywhere like in VBA!

When I am done with the extended string class, I also need to extend
the C++ language date functionality.

Lars

On 8 Apr, 02:52, tonydee <tony_in_da...@yahoo.co.uk> wrote:
> On Apr 8, 4:11*am, Lars Schouw <schou...@yahoo.com> wrote:
>
> > How can I extend the std::string class to become more cleaver with
> > regards to regexp build right into my extended string class?

>
> > * I am not allowed to derive from std::string since there is no
> > virtual destructor.

>
> As mentioned by Christian, this isn't a show stopper.
>
> > * I don't want to aggregate the std:string as a private member
> > variable since I need to expose all it's methods and maintain changes
> > in the future of the std standard.

>
> Understandable.
>
> > * I could have an extra util file that where all the functions takes
> > in the std::string as the first agument but this would not be as
> > elegant.

>
> In terms of elegance, can you show us what usage you're trying to
> achieve? *How it'd be "better" than boost::regex and std::string? *I
> need to see that before the implementation implications are obvious
> enough that I might offer concrete advice. *For now, I guess you want
> a variant that can be in string or regexp state, but how will you
> specify which type it should be in constructors and especially
> operator=? *What happens if people try to insert/replace etc. in a
> regexp: will you recompile the regexp each time, or lazily on first
> use? *There are lots of implementation questions and the usage and
> consequences may be hard to keep consistent, let alone test and
> document and train people in. *I suspect that when you get into this
> you'll find separate classes is cleaner and reliable than a fat
> interface merging concepts of both....
>
> Cheers,
> Tony



Lars Schouw 04-08-2010 08:42 AM

Re: extending std::string
 
If I wanted to go wild I would like the same from VBA strings in
Excel.
http://www.mvps.org/dmcritchie/excel/strings.htm


On 8 Apr, 09:29, Lars Schouw <schou...@yahoo.com> wrote:
> I understand it is very difficult to extend stl since it is elegantly
> designed to be used with containers and algoritms.
>
> Acually what I am trying to do it mimic powerful VBA string
> functionallity, which C++ seems to be missing out of the box.
>
> Here is a list of requirements:
>
> A) The VBA method Like can be done using regexp. regexp is part of C++
> 0X (TR1)
>
> B) Tokenize a string easily. Split stings by chars or string
> delimiters. Split stings in fixed sizes.
>
> C) trim strings trailing and ending of whitespaces and also strip
> strings of whitespaces
>
> D) Compare string case insensitive
>
> E) IsNumeric and IsAlphanumeric, determin if a string is numeric (0-9)
> or alphanumeric (a-z, A-Z and 0-9)
>
> F) Convert from string to bool, double, long or date
>
> G) Rounding of numbers in strings
>
> H) Easily handle pascal and C strings
>
> I) Ideally be able to stored in a stl container
>
> J) join a N strings into one.
>
> K) Repeate a string N times.
>
> L) convert strings to lower or upper case
>
> M) Find out if a string is lower or upper case
>
> N) swap lower and upper case.
>
> Keenan Tims seems to have done a number of them alreadyhttp://www.gotroot..ca/ext_string/
>
> I am not such a big fan of your do all functions that just encapsulate
> the helper functions, need to think a little.
> Maybe we should just do regexp everywhere like in VBA!
>
> When I am done with the extended string class, I also need to extend
> the C++ language date functionality.
>
> Lars
>
> On 8 Apr, 02:52, tonydee <tony_in_da...@yahoo.co.uk> wrote:
>
> > On Apr 8, 4:11*am, Lars Schouw <schou...@yahoo.com> wrote:

>
> > > How can I extend the std::string class to become more cleaver with
> > > regards to regexp build right into my extended string class?

>
> > > * I am not allowed to derive from std::string since there is no
> > > virtual destructor.

>
> > As mentioned by Christian, this isn't a show stopper.

>
> > > * I don't want to aggregate the std:string as a private member
> > > variable since I need to expose all it's methods and maintain changes
> > > in the future of the std standard.

>
> > Understandable.

>
> > > * I could have an extra util file that where all the functions takes
> > > in the std::string as the first agument but this would not be as
> > > elegant.

>
> > In terms of elegance, can you show us what usage you're trying to
> > achieve? *How it'd be "better" than boost::regex and std::string? *I
> > need to see that before the implementation implications are obvious
> > enough that I might offer concrete advice. *For now, I guess you want
> > a variant that can be in string or regexp state, but how will you
> > specify which type it should be in constructors and especially
> > operator=? *What happens if people try to insert/replace etc. in a
> > regexp: will you recompile the regexp each time, or lazily on first
> > use? *There are lots of implementation questions and the usage and
> > consequences may be hard to keep consistent, let alone test and
> > document and train people in. *I suspect that when you get into this
> > you'll find separate classes is cleaner and reliable than a fat
> > interface merging concepts of both....

>
> > Cheers,
> > Tony

>
>



Lars Schouw 04-08-2010 03:33 PM

Re: extending std::string
 
Christian,

Thank you for taking time to point out all the goodes of Boost to me.

So when will all this be part of standard C++ so there is no need to
use Boost?

By pascal strings I mean stdlen + string
C string is string \0

Lars

On 8 Apr, 11:42, Christian Hackl <ha...@sbox.tugraz.at> wrote:
> Lars Schouw ha scritto:
>
> > I understand it is very difficult to extend stl since it is elegantly
> > designed to be used with containers and algoritms.

>
> Actually, it's the other way round. Its elegance makes it easy to extend.
>
> > Acually what I am trying to do it mimic powerful VBA string
> > functionallity, which C++ seems to be missing out of the box.

>
> Yes, but it's all in Boost.
>
> You don't want to extend std::string with yet another 1000 functions
> when its interface is already too comprehensive as it is. Instead, you
> want to add new functionality in terms of existing member functions.
>
> > A) The VBA method Like can be done using regexp. regexp is part of C++
> > 0X (TR1)

>
> Just write a free-standing function like() function which uses regular
> expressions in its implementation.
>
> > B) Tokenize a string easily. Split stings by chars or string
> > delimiters. Split stings in fixed sizes.

>
> See Boost.Tokenizer.
>
> > C) trim strings trailing and ending of whitespaces and also strip
> > strings of whitespaces

>
> See the Boost String Algorithms library. It contains some trim functions.
>
> > D) Compare string case insensitive

>
> http://www.boost.org/doc/libs/1_42_0...orithm/ilexico...
>
> > E) IsNumeric and IsAlphanumeric, determin if a string is numeric (0-9)
> > or alphanumeric (a-z, A-Z and 0-9)

>
> This can be done by the String Algorithms library, too.
>
> > F) Convert from string to bool, double, long or date

>
> boost::lexical_cast, Boost.Date_Time.
>
> > G) Rounding of numbers in strings

>
> Convert the string to a number using boost::lexical_cast, then round,
> then convert it back to a string using boost::lexical_cast. If you need
> this functionality so often, then just put it into a convenience function..
>
> > H) Easily handle pascal and C strings

>
> std::string does easily handle C strings.
>
> Pascal strings? What do you mean?
>
> > I) Ideally be able to stored in a stl container

>
> std::string can be stored in any STL container.
>
> > J) join a N strings into one.

>
> That in the Boost String Algorithms library, too:
>
> http://www.boost.org/doc/libs/1_42_0...go/reference.h...
>
> > K) Repeate a string N times.

>
> If it's not in Boost String Algorithms, then it's trivial to implement
> by yourself.
>
> > L) convert strings to lower or upper case

>
> Again, Boost String Algorithms.
>
> > M) Find out if a string is lower or upper case

>
> if (boost::algorithm::all(my_string, boost::algorithm::is_lower))
> {
> * // ...
>
> }
> > N) swap lower and upper case.

>
> I think Boost does not provide anything like this, but it's not hard to
> write and put into a convenience function.
>
> > I am not such a big fan of your do all functions that just encapsulate
> > the helper functions, need to think a little.

>
> It's the other way round. Helper functions encapsulate core
> functionality. This is the preferred way of
>
> > Maybe we should just do regexp everywhere like in VBA!

>
> Why? It works fine the way it is.
>
> > When I am done with the extended string class, I also need to extend
> > the C++ language date functionality.

>
> No, you don't need to extend the C++ language date functionality. You
> need to learn Boost.Date_Time and use it :)
>
> http://www.boost.org/doc/libs/1_42_0...date_time.html
>
> --
> Christian Hackl
> ha...@sbox.tugraz.at
>
> Milano 2008/2009 -- L'Italia chiamò, sì!



Lars Schouw 04-08-2010 10:55 PM

Re: extending std::string
 
It is better since you don't rely on the silly end of string character
in C++.
It is also used in .dll interfaces in Windows as far as I remember.

No intermediate need just a nice to have.

Lars

On Apr 8, 6:13*pm, Christian Hackl <ha...@sbox.tugraz.at> wrote:
> Lars Schouw ha scritto:
>
> > Thank you for taking time to point out all the goodes of Boost to me.

>
> You're welcome :)
>
> > So when will all this be part of standard C++ so there is no need to
> > use Boost?

>
> Perhaps some of this will never make it into standard C++ because it's
> not considered useful, important or general-purpose enough to become
> part of the language.
>
> But is that really such a big problem? What keeps you from using Boost?
>
> > By pascal strings I mean stdlen + string

>
> I still didn't get it, because it's been 12 years since I used Pascal.
> The Internet, however, came up with the following description on
> Wikipedia [1]. I don't know if it's correct. Here we go:
>
> | The length of a string can also be stored explicitly, for example by
> | prefixing the string with the length as a byte value — a convention
> | used in Pascal; consequently some people call it a P-string.
>
> If I understand correctly, this is like constant char arrays in C++,
> whose length is known at compile time.
>
> But what would you need this feature for, anyway? It calls for trouble.
>
> [1]http://en.wikipedia.org/wiki/String_(computer_science)
>
> --
> Christian Hackl
> ha...@sbox.tugraz.at
>
> Milano 2008/2009 -- L'Italia chiamò, sì!



Lars Schouw 04-09-2010 02:18 PM

Re: extending std::string
 
Kai-Uwe,

Does that mean I can derive from a lower level class like
std::iterator or std::binary_predicate instead of std::string safely
and extend the string class that way?

still allowing it to be used in containers.

Lars

On 7 Apr, 20:21, Kai-Uwe Bux <jkherci...@gmx.net> wrote:
> Lars Schouw wrote:
> > How can I extend the std::string class to become more cleaver with
> > regards to regexp build right into my extended string class?

>
> > * I am not allowed to derive from std::string since there is no
> > virtual destructor.

>
> Uhm, in itself that should not stop you. There are other classes, like
> std::iterator or std::binary_predicate clearly meant to be derived from that
> lack virtual destructors.
>
> > * I don't want to aggregate the std:string as a private member
> > variable since I need to expose all it's methods and maintain changes
> > in the future of the std standard.

>
> Then, public derivation seems to be your friend. But there are some gotchas.
> You could also consider private derivation, which does require some using
> directives for forwarding. These, of course, would need to be updated with
> any change in the string class.
>
> > * I could have an extra util file that where all the functions takes
> > in the std::string as the first agument but this would not be as
> > elegant.

>
> Why not? To me, it appears that regular expressions are orthogonal to
> strings. In fact, I would picture a regexp class that can operate (determine
> matches, ...) on _any_ sequence of chars: std::string, std::vector< char >,
> std::deque< char >, ... I would assume that such a regexp class has member
> function templates like
>
> * template < typename Char >
> * class regexp {
>
> * * ...
>
> * * template < typename CharIter >
> * * bool match ( CharIter from, CharIter to );
>
> * * template < typename CharIter >
> * * CharIter first_match ( CharIter from, CharIter to );
>
> * };
>
> Best
>
> Kai-Uwe Bux



Kai-Uwe Bux 04-09-2010 03:17 PM

Re: extending std::string
 
Lars Schouw wrote:

> Kai-Uwe,
>
> Does that mean I can derive from a lower level class like
> std::iterator or std::binary_predicate instead of std::string safely
> and extend the string class that way?
>
> still allowing it to be used in containers.


a) Please don't top-post. That a cultural thing and frowned upon in these
parts. The reference for your question is clearer if you put it directly
below to what you are referring to.

> On 7 Apr, 20:21, Kai-Uwe Bux <jkherci...@gmx.net> wrote:
>> Lars Schouw wrote:
>> > How can I extend the std::string class to become more cleaver with
>> > regards to regexp build right into my extended string class?

>>
>> > * I am not allowed to derive from std::string since there is no
>> > virtual destructor.

>>
>> Uhm, in itself that should not stop you. There are other classes, like
>> std::iterator or std::binary_predicate clearly meant to be derived from
>> that lack virtual destructors.


b) I assume this is the context of your question.

No, I did not mean that you can derive from std::binary_predicate to extend
std::string. I meant that lack of a virtual destructor by and in itself is
not a sufficient reason to shun derivation.


Best

Kai-Uwe Bux

Lars Schouw 04-11-2010 08:49 PM

Re: extending std::string
 
On Apr 9, 4:17*pm, Kai-Uwe Bux <jkherci...@gmx.net> wrote:
> >> Uhm, in itself that should not stop you. There are other classes, like
> >> std::iterator or std::binary_predicate clearly meant to be derived from
> >> that lack virtual destructors.

>
> b) I assume this is the context of your question.
>
> No, I did not mean that you can derive from std::binary_predicate to extend
> std::string. I meant that lack of a virtual destructor by and in itself is
> not a sufficient reason to shun derivation.


OK, but in that case I would just have to be careful that my member
variables get's correct destructor in the derived class since it's
destructor will never be called?


All times are GMT. The time now is 10:00 AM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57