| Thread overview | |||||||||
|---|---|---|---|---|---|---|---|---|---|
|
September 02, 2014 Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Is it possible to override the behaviour of to!string(x) when x is an enum. I'm asking because this
enum CxxRefQualifier
{
none,
normalRef,
rvalueRef
}
string toString(CxxRefQualifier refQ) @safe pure nothrow
{
final switch (refQ)
{
case CxxRefQualifier.none: return "";
case CxxRefQualifier.normalRef: return "&";
case CxxRefQualifier.rvalueRef: return "&&";
}
}
doesn't affect behaviour of to!string(x) when x is an instance of CxxRefQualifier.
| ||||
September 02, 2014 Re: Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | On Tuesday, 2 September 2014 at 12:54:55 UTC, Nordlöw wrote:
> Is it possible to override the behaviour of to!string(x) when x is an enum. I'm asking because this
>
> enum CxxRefQualifier
> {
> none,
> normalRef,
> rvalueRef
> }
>
> string toString(CxxRefQualifier refQ) @safe pure nothrow
> {
> final switch (refQ)
> {
> case CxxRefQualifier.none: return "";
> case CxxRefQualifier.normalRef: return "&";
> case CxxRefQualifier.rvalueRef: return "&&";
> }
> }
>
> doesn't affect behaviour of to!string(x) when x is an instance of CxxRefQualifier.
i can think of two ways(both from memory)
1) specialized template override
template to(T: enum)(T s)
{
string to(T s) { .. your custom code .. }
}
or just stringof
CxxRefQualifier crq = CxxRefQualifier.normalRef;
assert(crq == "normalRef");
| |||
September 02, 2014 Re: Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to evilrat | sorry, i forgot everything.
here is example of how to do this
-----
import std.conv : to;
enum Test
{
One,
Two,
Three,
}
template to(T: string)
{
T to(A: Test)(A val)
{
final switch (val)
{
case Test.One: return "1";
case Test.Two: return "2";
case Test.Three: return "3";
}
}
}
void main()
{
assert(to!string(Test.One) == "1");
auto t = cast(Test)2;
assert(to!string(t) == "3");
assert(to!int("4") == 4); // shows original to! template works
}
| |||
September 02, 2014 Re: Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | On Tuesday, 2 September 2014 at 12:54:55 UTC, Nordlöw wrote:
> Is it possible to override the behaviour of to!string(x) when x is an enum. I'm asking because this
>
> enum CxxRefQualifier
> {
> none,
> normalRef,
> rvalueRef
> }
>
> string toString(CxxRefQualifier refQ) @safe pure nothrow
> {
> final switch (refQ)
> {
> case CxxRefQualifier.none: return "";
> case CxxRefQualifier.normalRef: return "&";
> case CxxRefQualifier.rvalueRef: return "&&";
> }
> }
>
> doesn't affect behaviour of to!string(x) when x is an instance of CxxRefQualifier.
That won't work, because your "toString" is a free function. The module system doesn't allow this kind of "Koenig lookup"-like hijack. The only reason it allows for things like front/popFront and arrays, is that the other modules import std.array, and are "aware" of the functions. This is not true for user defined types. This may or may not be a feature :)
Unless we allow defining "enum-member functions", AFAIK, it is impossible to override the printing behavior for enums... short of injecting your own modules in std.format/std.conv. Or to have a parameter "moduleLookup" in said template functions.
| |||
September 02, 2014 Re: Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to evilrat | On Tuesday, 2 September 2014 at 14:59:41 UTC, evilrat wrote:
> sorry, i forgot everything.
> here is example of how to do this
> -----
>
> import std.conv : to;
>
> enum Test
> {
> One,
> Two,
> Three,
> }
>
>
> template to(T: string)
> {
> T to(A: Test)(A val)
> {
> final switch (val)
> {
> case Test.One: return "1";
> case Test.Two: return "2";
> case Test.Three: return "3";
> }
> }
> }
>
>
> void main()
> {
> assert(to!string(Test.One) == "1");
> auto t = cast(Test)2;
> assert(to!string(t) == "3");
> assert(to!int("4") == 4); // shows original to! template works
> }
Word of warning: You are not overriding "to", but rather, simply defining your own "to" locally, which resolves as a better match in the context where you are using it.
If you pass the enum to another function in another module, your "to" will NOT be called.
| |||
September 02, 2014 Re: Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to monarch_dodra | On Tuesday, 2 September 2014 at 15:41:17 UTC, monarch_dodra wrote: > Unless we allow defining "enum-member functions", AFAIK, it is impossible to override the printing behavior for enums... ... If your enum actually represents strings, then you could: enum CxxRefQualifier : string { none = "", normalRef = "&", rvalueRef = "&&", } That in itself is not enough, but you *can* cast your enum to string, and then print that, or pass that. See also: https://issues.dlang.org/show_bug.cgi?id=11571 | |||
September 02, 2014 Re: Overriding to!string on enum types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to monarch_dodra | On Tuesday, 2 September 2014 at 15:42:36 UTC, monarch_dodra wrote:
>
> Word of warning: You are not overriding "to", but rather, simply defining your own "to" locally, which resolves as a better match in the context where you are using it.
>
> If you pass the enum to another function in another module, your "to" will NOT be called.
i know. and because of that this template in same scope as enum
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply