Some problems with std.typecons.Nullable. It automaticaly calls get and fails (when null)
Simen Kjærås
simen.kjaras at gmail.com
Mon Dec 9 05:53:04 PST 2013
On 09.12.2013 14:33, Uranuz wrote:
> In my code I wanted to use std.typecons.Nullable to get advantages in
> web application when working with database values. I'm writing some
> struct that can get Nullable!int as input value. But instead of getting
> struct object itself (in case of overloading) *get* method called and
> programme fails. This happens when Nullable is null. I'll give an example:
>
> //------
> import std.stdio;
>
> import std.typecons;
>
> template isStdNullable(N)
> {
> static if( is( N == NullableRef!(TL1), TL1... ) )
> enum bool isStdNullable = true;
> else static if( is( N == Nullable!(TL2), TL2... ) )
> enum bool isStdNullable = true;
> else
> enum bool isStdNullable = false;
> }
>
>
> template getStdNullableType(N)
> {
> static if( is( N == NullableRef!(TL2), TL2... ) )
> alias TL2[0] getStdNullableType;
> else static if( is( N == Nullable!(TL2), TL2... ) )
> alias TL2[0] getStdNullableType;
> else
> static assert (0, `Type ` ~ fullyQualifiedName!(N) ~ ` can't be
> used as Nullable type!!!` );
> }
>
>
>
> struct Test
> {
> //Uncommenting these lines makes programme fail with assertion
> //string opIndex(int key) const
> //{ return "Not null"; }
>
> //inout(bool) opBinaryRight(string op)(int key) inout
> //{ return true; }
>
> string opIndex(N)(N key) const
> if( isStdNullable!(N) && is( getStdNullableType!(N) == int ) )
> { return ( key.isNull() ? "null" : "Not null" );
>
> }
>
> inout(bool) opBinaryRight(string op, N)(N key) inout
> if(op == "in" && isStdNullable!(N) && is(
> getStdNullableType!(N) == int ))
> { return ( key.isNull() ? true : false ); }
>
> }
>
>
> void main()
> {
> Test test;
>
> Nullable!(int, 10) val5;
> val5 = 5;
>
> Nullable!(int, 15) valNull;
>
> writeln(test[val5]);
> writeln(test[valNull]);
>
> writeln(val5 in test);
> writeln(valNull in test);
>
> }
> //--------------------
>
> In this code I want get ability to pass int values and Nullable!int
> values using overloaded operators. Template "functions" isStdNullable,
> getStdNullableType help to get information about type of *N*. I think
> that there is something that I don't understand about order of
> instantiation for overloaded functions.
> How could I solve this problem? Or I need to write my own Nullable
> variant without "alias get this;"?
The simple solution is to make your int-specialized functions do their
specialization in template constraints:
string opIndex(N)(N key) const if (is(N == int))
{ return "Not null"; }
bool opBinaryRight(string op, N)(N key) const if (is(N == int))
{ return true; }
I'm not entirely sure why this behavior occurs. One would think not
applying alias this would make for a better match than applying it.
btw, in the future you might want to keep discussions like this in
digitalmars.D.learn.
--
Simen
More information about the Digitalmars-d
mailing list