How do I pass a type as parameter in this method?

Dgame r.schuett.1987 at gmail.com
Tue Dec 19 15:52:57 UTC 2017


On Tuesday, 19 December 2017 at 15:19:53 UTC, Marc wrote:
> On Tuesday, 19 December 2017 at 00:01:00 UTC, Ali Çehreli wrote:
>> On 12/18/2017 03:54 PM, Ali Çehreli wrote:
>>> On 12/18/2017 02:58 PM, Marc wrote:
>>
>> Here's another experiment:
>>
>> template FirstOf(T...) {
>>     template otherwise(D) {
>>         static if (T.length == 0) {
>>             enum otherwise = D.init;
>>         } else {
>>             enum otherwise = T[0];
>>         }
>>     }
>> }
>>
>> void main() {
>>     static assert (FirstOf!(1.5, "hello").otherwise!int == 
>> 1.5);
>>     static assert (FirstOf!("world", [1]).otherwise!int == 
>> "world");
>>     static assert (FirstOf!().otherwise!int == 0);
>> }
>>
>> Ali
>
> Thanks four answer. I'll be using this one. I was messing 
> around and getting multiple arguments to template function too. 
> I like the naming too, it made code clear, imo.
>
> It's possible to have overload where one take a type name and 
> the other a variable (constant value actually)? something like 
> this (also imaginary code):
>
>> template FirstOf(TP...) {
>> 	template otherwise(D) {
>> 		static if(TP.length > 0) {
>> 			enum otherwise = TP[0];
>> 		} else {
>> 			enum otherwise = D.init;
>> 		}
>> 	}
>> 	template otherwise(D value) {
>> 		static if(TP.length > 0) {
>> 			enum otherwise = TP[0];
>> 		} else {
>> 			enum otherwise = value;
>> 		}
>> 	}
>> }
>
> So I can use like this:
>
>> int index = FirstOf!(myTuple).otherwise!int;
>> int value = FirstOf(myTuple2).otherwise!(10);
>
> with my limited template knowledge, I know I can write it like 
> this:
>
>> 	template otherwise(D, D value) {
>> 		static if(TP.length > 0) {
>> 			enum otherwise = TP[0];
>> 		} else {
>> 			enum otherwise = value;
>> 		}
>> 	}
>
> So the call would go like this:
>
>> int value = FirstOf(myTuple2).otherwise!(int, 10);
>
> But for simplicity I'd like to infer the type from constant 
> value passed in parameter, in that case, the integer value of 
> 10.

template FirstOf(T...) {
     template otherwise(D) {
         static if (T.length == 0) {
             enum otherwise = D.init;
         } else {
             enum otherwise = T[0];
         }
     }

     template otherwise(alias value) {
         static if (T.length == 0) {
             enum otherwise = value;
         } else {
             enum otherwise = T[0];
         }
     }
}

void main() {
     static assert (FirstOf!(1.5, "hello").otherwise!int == 1.5);
     static assert (FirstOf!("world", [1]).otherwise!int == 
"world");
     static assert (FirstOf!().otherwise!int == 0);
     static assert (FirstOf!(1.5, "hello").otherwise!23 == 1.5);
     static assert (FirstOf!().otherwise!42 == 42);
}


More information about the Digitalmars-d-learn mailing list