Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
July 05, 2018 std.traits : Select - could it be better? | ||||
---|---|---|---|---|
| ||||
alias U = Select!( isPointer!T, PointerTarget!T, T ); This don´t compile if T are not a pointer; so you have to do this: static if( isPointer!T ) alias U = PointerTarget!T; else alias U = T; Shouldnt the 'correct' way of Select to work is ignoring the choice that was not taken? I love the idea of Select, but because of this I almost never use it. |
July 05, 2018 Re: std.traits : Select - could it be better? | ||||
---|---|---|---|---|
| ||||
Posted in reply to SrMordred | On 7/5/18 2:50 PM, SrMordred wrote:
> alias U = Select!( isPointer!T, PointerTarget!T, T );
>
> This don´t compile if T are not a pointer;
>
> so you have to do this:
>
> static if( isPointer!T )
> alias U = PointerTarget!T;
> else
> alias U = T;
>
> Shouldnt the 'correct' way of Select to work is ignoring the choice that was not taken?
>
> I love the idea of Select, but because of this I almost never use it.
mixin("alias U = " ~ Select!(isPointer!T, "PointerTarget!T", "T") ~ ";");
Ehm this is actually not better :o).
Andrei
|
July 05, 2018 Re: std.traits : Select - could it be better? | ||||
---|---|---|---|---|
| ||||
Posted in reply to SrMordred | On 7/5/18 2:50 PM, SrMordred wrote:
> alias U = Select!( isPointer!T, PointerTarget!T, T );
>
> This don´t compile if T are not a pointer;
>
> so you have to do this:
>
> static if( isPointer!T )
> alias U = PointerTarget!T;
> else
> alias U = T;
>
> Shouldnt the 'correct' way of Select to work is ignoring the choice that was not taken?
>
> I love the idea of Select, but because of this I almost never use it.
Hm... only thing I can think of is to do the instantiation within the template itself:
template BetterSelect(bool cond, alias temp1, alias temp2, Args...)
{
import std.meta : Instantiate;
static if(cond)
alias BetterSelect = Instantiate!(temp1, Args);
else
alias BetterSelect = Instantiate!(temp2, Args);
}
alias U = BetterSelect!(isPointer!T, PointerTarget, Alias, T)
Of course, this requires you to have templates that take EXACTLY the same parameters.
I don't know if this (or something like it) is worth adding to std.traits or std.meta.
-Steve
|
July 05, 2018 Re: std.traits : Select - could it be better? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On 7/5/18 4:27 PM, Steven Schveighoffer wrote:
> template BetterSelect(bool cond, alias temp1, alias temp2, Args...)
> {
> import std.meta : Instantiate;
> static if(cond)
> alias BetterSelect = Instantiate!(temp1, Args);
> else
> alias BetterSelect = Instantiate!(temp2, Args);
> }
ugh, got too cute for my own good :) No need for Instantiate here:
alias BetterSelect = temp1!Args;
alias BetterSelect = temp2!Args;
-Steve
|
July 06, 2018 Re: std.traits : Select - could it be better? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Thursday, 5 July 2018 at 20:29:02 UTC, Steven Schveighoffer wrote:
> On 7/5/18 4:27 PM, Steven Schveighoffer wrote:
>> template BetterSelect(bool cond, alias temp1, alias temp2, Args...)
>> {
>> import std.meta : Instantiate;
>> static if(cond)
>> alias BetterSelect = Instantiate!(temp1, Args);
>> else
>> alias BetterSelect = Instantiate!(temp2, Args);
>> }
>
> ugh, got too cute for my own good :) No need for Instantiate here:
>
> alias BetterSelect = temp1!Args;
> alias BetterSelect = temp2!Args;
>
> -Steve
I find another solution :)
template Try(alias T, Args...)
{
static if( is( T!Args ) )
alias Try = T!Args;
}
alias U = Select!( isPointer!T, Try!( PointerTarget, T ), T );
|
July 06, 2018 Re: std.traits : Select - could it be better? | ||||
---|---|---|---|---|
| ||||
Posted in reply to SrMordred | On 7/5/18 10:17 PM, SrMordred wrote:
> I find another solution :)
>
> template Try(alias T, Args...)
> {
> static if( is( T!Args ) )
> alias Try = T!Args;
> }
>
> alias U = Select!( isPointer!T, Try!( PointerTarget, T ), T );
>
I like it!
-Steve
|
Copyright © 1999-2021 by the D Language Foundation