Template return values?

Dmitry Olshansky dmitry.olsh at gmail.com
Tue Dec 4 09:43:09 PST 2012


12/4/2012 4:08 PM, Jacob Carlborg пишет:
> On 2012-12-04 08:48, Era Scarecrow wrote:
>>   A thought's been going through my head for a while now. I wonder about
>> template return values. Function signatures are usually the inputs and
>> NOT the return type. However for writing a variant type could be so very
>> useful. So unless I've misunderstood, this doesn't work (but it would be
>> cool if it did).
>>
>> struct Variant {
>>    enum ValueType {Long, Float, Double}
>>
>>    ValueType vt;
>>    union {
>>      long lng;
>>      float fl;
>>      double dbl;
>>    }
>>
>>    T getValue(T)() @property
>>    if (T == long || T == float || T == double) { //allowable types
>>      static if (T == long) { //only long case written for brevity
>>        switch(vt) {
>>          //entries would likely be mixed in and not written manually...
>>          case Long: return lng;
>>          case Float:
>>            assert(lng >= float.min && lng <= float.max);
>>            return cast(float) lng;
>>          case Float:
>>            assert(lng >= double.min && lng <= double.max);
>>            return cast(double) lng;
>>        }
>>      }
>>
>>      assert(0, "Fell through, should never get here");
>>    }
>> }
>>
>>
>>   So then in theory
>>
>>   Variant v;
>>   int i = v.getValue; //calls getValue!int()
>
> You can use "alias this", but that only works for one type.
>
> http://dlang.org/class.html#AliasThis
>

Well TDPL claims multiple alias this is allowed so in some distant 
future it maybe possible for Varaint to alias this to all built-in types.

-- 
Dmitry Olshansky


More information about the Digitalmars-d-learn mailing list