www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - string composition

reply B.G. <B.G._member pathlink.com> writes:
Hi!

I was trying to port a C++ project to D.
I have many inplace string manipulations like this:

func("unexpected symbol: " + c);

where c may be any base type like char, int, etc.

In java those operations are part of the language
(this solution works perfectly with java language as such)
In C++ operator overloading is used and it's OK too.

Is there a nice way to do the above in D?
As far as I know, D operator overloading works only with objects and structs.
I'm not a fan of the own-string-class philosophy, so I'm actually talking about
char[].

This question is not about printf and friends.

I love the way it works in java, It's just perfect for SMALL things like the
example above.

What's your opinion?
Apr 28 2005
next sibling parent reply "Andrew Fedoniouk" <news terrainformatica.com> writes:
String concatenation is operator '~'

func("unexpected symbol: " ~ c);

but the best way is to use implicit format
func( format( "unexpected symbol: %d",i) );


"B.G." <B.G._member pathlink.com> wrote in message 
news:d4r3hk$16nq$1 digitaldaemon.com...
 Hi!

 I was trying to port a C++ project to D.
 I have many inplace string manipulations like this:

 func("unexpected symbol: " + c);

 where c may be any base type like char, int, etc.

 In java those operations are part of the language
 (this solution works perfectly with java language as such)
 In C++ operator overloading is used and it's OK too.

 Is there a nice way to do the above in D?
 As far as I know, D operator overloading works only with objects and 
 structs.
 I'm not a fan of the own-string-class philosophy, so I'm actually talking 
 about
 char[].

 This question is not about printf and friends.

 I love the way it works in java, It's just perfect for SMALL things like 
 the
 example above.

 What's your opinion?


 

Apr 28 2005
parent reply B.G. <B.G._member pathlink.com> writes:
In article <d4r6cu$1a7c$1 digitaldaemon.com>, Andrew Fedoniouk says...
String concatenation is operator '~'

func("unexpected symbol: " ~ c);

but ~ only works if both operands are arrays, the above doesn't even work if c is a char. (at least with gdc compiler)
but the best way is to use implicit format
func( format( "unexpected symbol: %d",i) );

"B.G." <B.G._member pathlink.com> wrote in message 
news:d4r3hk$16nq$1 digitaldaemon.com...
 Hi!

 I was trying to port a C++ project to D.
 I have many inplace string manipulations like this:

 func("unexpected symbol: " + c);

 where c may be any base type like char, int, etc.

 In java those operations are part of the language
 (this solution works perfectly with java language as such)
 In C++ operator overloading is used and it's OK too.

 Is there a nice way to do the above in D?
 As far as I know, D operator overloading works only with objects and 
 structs.
 I'm not a fan of the own-string-class philosophy, so I'm actually talking 
 about
 char[].

 This question is not about printf and friends.

 I love the way it works in java, It's just perfect for SMALL things like 
 the
 example above.

 What's your opinion?


 


Apr 28 2005
parent "Unknown W. Brackets" <unknown simplemachines.org> writes:
Well, you could use format as above, or a temporary array:

char[] arr = "unexpected symbol: ";
arr ~= c;
func(arr);

Which isn't beautiful, yes.  If we had array literals, which I would 
love but we do not, that would most likely be the simplest way.

-[Unknown]


 In article <d4r6cu$1a7c$1 digitaldaemon.com>, Andrew Fedoniouk says...
 
String concatenation is operator '~'

func("unexpected symbol: " ~ c);

but ~ only works if both operands are arrays, the above doesn't even work if c is a char. (at least with gdc compiler)
but the best way is to use implicit format
func( format( "unexpected symbol: %d",i) );


Apr 28 2005
prev sibling parent Derek Parnell <derek psych.ward> writes:
On Thu, 28 Apr 2005 16:38:12 +0000 (UTC), B.G. wrote:

 Hi!
 
 I was trying to port a C++ project to D.
 I have many inplace string manipulations like this:
 
 func("unexpected symbol: " + c);
 
 where c may be any base type like char, int, etc.
 
 In java those operations are part of the language
 (this solution works perfectly with java language as such)
 In C++ operator overloading is used and it's OK too.
 
 Is there a nice way to do the above in D?
 As far as I know, D operator overloading works only with objects and structs.
 I'm not a fan of the own-string-class philosophy, so I'm actually talking about
 char[].

as you would like. That is mainly because you can't provide operator overrides to arrays. However, to get the effect you want is not a great effort to do in D. Here some example code that I hope helps .. <code> private import std.stdio; private import std.string; // Template for arbitrary native data type string concatenation template func(T) { char[] func(char[] pData, T pExtra) { // convert input to string, concatenate and return result return std.string.format("%s%s", pData, pExtra); } } // Make a few aliases to improve readability. alias func!(char) funcmsg; alias func!(int) funcmsg; alias func!(double) funcmsg; void main() { char lChar; int lInt; double lDouble; lChar = 'a'; lInt = 3; lDouble = 2.41; // func("unexpected symbol: " ~ lChar); // fails // func("unexpected symbol: " ~ lInt); // fails // func("unexpected symbol: " ~ lDouble); //fails writefln( funcmsg("unexpected symbol: " , lChar) ); writefln( funcmsg("unexpected symbol: " , lInt) ); writefln( funcmsg("unexpected symbol: " , lDouble) ); } </code> -- Derek Parnell Melbourne, Australia 29/04/2005 7:07:02 AM
Apr 28 2005