View mode: basic / threaded / horizontal-split · Log in · Help
October 02, 2012
Setting defaults to variadic template args
Is it possible?

Eg:
 struct Event(T... = (int, float))
 {
   void F(T...); // <- should default to F(int, float)
 }

Does anyone have any clever tricks that will work in this scenario? Some
magic tuple syntax?
October 02, 2012
Re: Setting defaults to variadic template args
On 2012-10-02 15:15, Manu wrote:
> Is it possible?
>
> Eg:
>    struct Event(T... = (int, float))
>    {
>      void F(T...); // <- should default to F(int, float)
>    }
>
> Does anyone have any clever tricks that will work in this scenario? Some
> magic tuple syntax?

struct Event
{
    static if (T.length == 0)
        void F(int, float);

    else
        void F(T);
}

Perhaps?

-- 
/Jacob Carlborg
October 02, 2012
Re: Setting defaults to variadic template args
module program;

import std.stdio;
import std.traits;
import std.typetuple;

struct Event (T...) {

  alias EraseAll!(void, TypeTuple!(T,
    Select!(T.length < 1, int, void),
    Select!(T.length < 2, float, void),
  )) T2;

  void F (T2 args) {
    writeln(typeid(typeof(args)));
  }

}

void main () {

  Event!() e1;

  e1.F(5, 6);

}


On Tuesday, 2 October 2012 at 13:15:08 UTC, Manu wrote:
> Is it possible?
>
> Eg:
>   struct Event(T... = (int, float))
>   {
>     void F(T...); // <- should default to F(int, float)
>   }
>
> Does anyone have any clever tricks that will work in this 
> scenario? Some
> magic tuple syntax?
October 02, 2012
Re: Setting defaults to variadic template args
Or maybe... This seems like a much better solution:


module program;

import std.stdio;
import std.traits;
import std.typetuple;

template SelectTrue (bool condition, T) {
  static if (condition)
    alias T SelectTrue;
}

struct Event (T...) {

  alias TypeTuple!(T,
    SelectTrue!(T.length < 1, int),
    SelectTrue!(T.length < 2, float),
  ) T2;

  void F (T2 args) {
    writeln(typeid(typeof(args)));
  }

}

void main () {

  Event!() e1;

  e1.F(5, 6);

}



On Tuesday, 2 October 2012 at 13:44:10 UTC, luka8088 wrote:
>
> module program;
>
> import std.stdio;
> import std.traits;
> import std.typetuple;
>
> struct Event (T...) {
>
>   alias EraseAll!(void, TypeTuple!(T,
>     Select!(T.length < 1, int, void),
>     Select!(T.length < 2, float, void),
>   )) T2;
>
>   void F (T2 args) {
>     writeln(typeid(typeof(args)));
>   }
>
> }
>
> void main () {
>
>   Event!() e1;
>
>   e1.F(5, 6);
>
> }
>
>
> On Tuesday, 2 October 2012 at 13:15:08 UTC, Manu wrote:
>> Is it possible?
>>
>> Eg:
>>  struct Event(T... = (int, float))
>>  {
>>    void F(T...); // <- should default to F(int, float)
>>  }
>>
>> Does anyone have any clever tricks that will work in this 
>> scenario? Some
>> magic tuple syntax?
October 02, 2012
Re: Setting defaults to variadic template args
And the simplest solution wins:

module program;

import std.stdio;
import std.traits;
import std.typetuple;

struct Event (T1 = int, T2 = float, Telse...) {

  alias TypeTuple!(T1, T2, Telse) T;

  void F (T args) {
    writeln(typeid(typeof(args)));
  }

}

void main () {

  Event!() e1;

  e1.F(5, 6);

}

I hope that you found the solution that you where looking for.

On Tuesday, 2 October 2012 at 13:49:56 UTC, luka8088 wrote:
> Or maybe... This seems like a much better solution:
>
>
> module program;
>
> import std.stdio;
> import std.traits;
> import std.typetuple;
>
> template SelectTrue (bool condition, T) {
>   static if (condition)
>     alias T SelectTrue;
> }
>
> struct Event (T...) {
>
>   alias TypeTuple!(T,
>     SelectTrue!(T.length < 1, int),
>     SelectTrue!(T.length < 2, float),
>   ) T2;
>
>   void F (T2 args) {
>     writeln(typeid(typeof(args)));
>   }
>
> }
>
> void main () {
>
>   Event!() e1;
>
>   e1.F(5, 6);
>
> }
>
>
>
> On Tuesday, 2 October 2012 at 13:44:10 UTC, luka8088 wrote:
>>
>> module program;
>>
>> import std.stdio;
>> import std.traits;
>> import std.typetuple;
>>
>> struct Event (T...) {
>>
>>  alias EraseAll!(void, TypeTuple!(T,
>>    Select!(T.length < 1, int, void),
>>    Select!(T.length < 2, float, void),
>>  )) T2;
>>
>>  void F (T2 args) {
>>    writeln(typeid(typeof(args)));
>>  }
>>
>> }
>>
>> void main () {
>>
>>  Event!() e1;
>>
>>  e1.F(5, 6);
>>
>> }
>>
>>
>> On Tuesday, 2 October 2012 at 13:15:08 UTC, Manu wrote:
>>> Is it possible?
>>>
>>> Eg:
>>> struct Event(T... = (int, float))
>>> {
>>>   void F(T...); // <- should default to F(int, float)
>>> }
>>>
>>> Does anyone have any clever tricks that will work in this 
>>> scenario? Some
>>> magic tuple syntax?
October 02, 2012
Re: Setting defaults to variadic template args
On 10/02/2012 03:15 PM, Manu wrote:
>    struct Event(T... = (int, float))
>    {
>      void F(T...); // <- should default to F(int, float)
>    }

template Event(){alias Event!(int,float) Event;}
struct Event(T...){
    void F(T...);
}
Top | Discussion index | About this forum | D home