www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Template string literal?

reply Jacob Carlborg <doob me.com> writes:
Is it possible to declare string literal of a template type, something 
like this:

void bar (const(T)[] a) {}

void foo (T) (const(T)[] a)
{
     bar("abc"T);
}

foo("def"w);

In this case the string literal passed to "bar" would be of the type 
"wstring".

Is this somehow possible or do I have to create a variable?

-- 
/Jacob Carlborg
Mar 16 2011
next sibling parent "Simen kjaeraas" <simen.kjaras gmail.com> writes:
On Wed, 16 Mar 2011 22:30:17 +0100, Jacob Carlborg <doob me.com> wrote:

 Is it possible to declare string literal of a template type, something  
 like this:

 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
      bar("abc"T);
 }

 foo("def"w);

 In this case the string literal passed to "bar" would be of the type  
 "wstring".

 Is this somehow possible or do I have to create a variable?
Not having D available, I would say this should work: void foo( T )( const( T )[] a ) { bar( cast(T)"abc" ); } Otherwise: template stringSuffix( T ) { static if ( is( Unqual!T == char ) ) { enum stringSuffix = "c"; } else static if ( is( Unqual!T == wchar ) ) { enum stringSuffix = "w"; } else static if ( is( Unqual!T == dchar ) ) { enum stringSuffix = "d"; } else { static assert( false ); } } void foo( T )( const( T )[] a ) { bar( mixin( `"abc"` ~ stringSuffix!T ) ); } -- Simen
Mar 16 2011
prev sibling parent reply "Denis Koroskin" <2korden gmail.com> writes:
On Thu, 17 Mar 2011 00:30:17 +0300, Jacob Carlborg <doob me.com> wrote:

 Is it possible to declare string literal of a template type, something  
 like this:

 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
      bar("abc"T);
 }

 foo("def"w);

 In this case the string literal passed to "bar" would be of the type  
 "wstring".

 Is this somehow possible or do I have to create a variable?
 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
bar!(T)("abc"); // same as: const(T)[] abc = "abc"; bar(abc);
 }

 foo("def"w);
Mar 16 2011
parent reply "Simen kjaeraas" <simen.kjaras gmail.com> writes:
On Wed, 16 Mar 2011 22:39:00 +0100, Denis Koroskin <2korden gmail.com>  
wrote:

 On Thu, 17 Mar 2011 00:30:17 +0300, Jacob Carlborg <doob me.com> wrote:

 Is it possible to declare string literal of a template type, something  
 like this:

 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
      bar("abc"T);
 }

 foo("def"w);

 In this case the string literal passed to "bar" would be of the type  
 "wstring".

 Is this somehow possible or do I have to create a variable?
 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
bar!(T)("abc"); // same as: const(T)[] abc = "abc"; bar(abc);
 }

 foo("def"w);
I shoulda thought of that. Much cleaner than my solution. -- Simen
Mar 16 2011
parent Jacob Carlborg <doob me.com> writes:
On 2011-03-16 22:41, Simen kjaeraas wrote:
 On Wed, 16 Mar 2011 22:39:00 +0100, Denis Koroskin <2korden gmail.com>
 wrote:

 On Thu, 17 Mar 2011 00:30:17 +0300, Jacob Carlborg <doob me.com> wrote:

 Is it possible to declare string literal of a template type,
 something like this:

 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
 bar("abc"T);
 }

 foo("def"w);

 In this case the string literal passed to "bar" would be of the type
 "wstring".

 Is this somehow possible or do I have to create a variable?
 void bar (const(T)[] a) {}

 void foo (T) (const(T)[] a)
 {
bar!(T)("abc"); // same as: const(T)[] abc = "abc"; bar(abc);
 }

 foo("def"w);
I shoulda thought of that. Much cleaner than my solution.
Yeah, me too. Thanks. -- /Jacob Carlborg
Mar 17 2011