Implicit string lit conversion to wstring/dstring

Alex Rønne Petersen xtzgzorex at gmail.com
Wed Mar 14 11:16:15 PDT 2012


On 14-03-2012 19:16, H. S. Teoh wrote:
> On Wed, Mar 14, 2012 at 07:00:35PM +0100, Alex Rønne Petersen wrote:
>> On 14-03-2012 19:00, H. S. Teoh wrote:
>>> Code:
>>> 	import std.stdio;
>>> 	version(explicit) {
>>> 		void func(dstring s) {
>>> 			dstring t = s;
>>> 			writeln(t);
>>> 		}
>>> 	} else {
>>> 		void func(S)(S s) {
>>> 			dstring t = s;	// line 10
>>> 			writeln(t);
>>> 		}
>>> 	}
>>> 	void main() {
>>> 		func("abc");
>>> 	}
>>>
>>> If version=explicit is set, the program compiles fine. But if not, then
>>> the compiler complains:
>>>
>>> 	test.d:10: Error: cannot implicitly convert expression (s) of type string to immutable(dchar)[]
>>>
>>> What do I need to do to make the template version of func trigger
>>> implicit conversion of the string lit to dstring? What I'm trying to do
>>> is to templatize dstring as well, but still benefit from the
>>> string->dstring conversion when instantiated with dstring.
>>>
>>> (Ditto with implicit conversion to wstring.)
>>>
>>>
>>> T
>>>
>>
>> I doubt that such an implicit conversion even exists. You have to
>> prefix the string appropriately, e.g.:
>
> OK, maybe implicit conversion is the wrong word. The compiler is
> obviously interpreting func("abc") as func("abc"d) when we declare
> func(dstring). But when we declare func(S)(S), the compiler deduces
> "abc" as string and sets S=string.
>
> What I want is to force the compiler to deduce S=dstring when I declare
> func(S)(S) and call it as func("abc").
>
>
> T
>

But then... why not just make it take a dstring? Maybe I'm not following 
your intent here...

Anyway, what Phobos functions tend to do is to set S = string by default 
and otherwise force people to either pass the string type *or* use the 
string suffices.

-- 
- Alex


More information about the Digitalmars-d mailing list