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