Thread overview
Setting defaults to variadic template args
Oct 02, 2012
Manu
Oct 02, 2012
Jacob Carlborg
Oct 02, 2012
luka8088
Oct 02, 2012
luka8088
Oct 02, 2012
luka8088
Oct 02, 2012
Timon Gehr
October 02, 2012
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
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
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
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
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
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...);
}