Re: Template with default parameter

2022-03-11 Thread Andrey Zherikov via Digitalmars-d-learn

On Friday, 11 March 2022 at 12:53:56 UTC, Adam D Ruppe wrote:

On Friday, 11 March 2022 at 12:01:27 UTC, Andrey Zherikov wrote:
There is some inconsistency between templates and template 
functions as this works as I want to:


Yeah, functions have the special feature of implicit 
instantiation from the function arguments. No other template 
do, if you want an instance there, you need to specify it as a 
!(). And since functions can't return aliases to types you 
can't use that to get around it. There's no way to do what you 
want to do, you either need to write the !() or use a different 
alias name.


Thanks for explanation!


Re: Template with default parameter

2022-03-11 Thread Adam D Ruppe via Digitalmars-d-learn

On Friday, 11 March 2022 at 12:01:27 UTC, Andrey Zherikov wrote:
There is some inconsistency between templates and template 
functions as this works as I want to:


Yeah, functions have the special feature of implicit 
instantiation from the function arguments. No other template do, 
if you want an instance there, you need to specify it as a !(). 
And since functions can't return aliases to types you can't use 
that to get around it. There's no way to do what you want to do, 
you either need to write the !() or use a different alias name.


Re: Template with default parameter

2022-03-11 Thread Ali Çehreli via Digitalmars-d-learn

On 3/11/22 04:01, Andrey Zherikov wrote:
> There is some inconsistency between templates and template functions as
> this works as I want to:
> ```d
> import std.stdio;
>
> void f(int i=3)()
> {
>  writeln(i);
> }
>
> void main()
> {
>  f!1;  // 1
>  f!(); // 3
>  f;// 3
> }
> ```

Reduced:

template T(int i = 3) {
  enum value = i;
}

void main() {
  pragma(msg, T!().value);  // Requires T!()
}

The same inconsistency exists for user-defined type templates as well:

struct S(int i = 3) {
}

void main() {
  S!() s;  // Requires S!()
}

There has been requests to remove this inconsistency. Might be in bugzilla.

Ali



Re: Template with default parameter

2022-03-11 Thread Andrey Zherikov via Digitalmars-d-learn
There is some inconsistency between templates and template 
functions as this works as I want to:

```d
import std.stdio;

void f(int i=3)()
{
writeln(i);
}

void main()
{
f!1;  // 1
f!(); // 3
f;// 3
}
```


Re: Template with default parameter

2022-03-11 Thread bauss via Digitalmars-d-learn

On Friday, 11 March 2022 at 11:55:24 UTC, Andrey Zherikov wrote:

On Friday, 11 March 2022 at 07:06:15 UTC, bauss wrote:

Create an alias for T!() is the best you can do.

Ex.

```
alias t = T!();
```

There isn't really any better method as far as I know.


I'd like to preserve the name (`t` != `T`) but `alias T = T!()` 
gives me `Error: declaration `T` is already defined`


Yeah you can't really do much about that.

Then T would have to be something like TImpl and then you do 
`alias T = TImpl!();`


Re: Template with default parameter

2022-03-11 Thread Andrey Zherikov via Digitalmars-d-learn

On Friday, 11 March 2022 at 07:06:15 UTC, bauss wrote:

Create an alias for T!() is the best you can do.

Ex.

```
alias t = T!();
```

There isn't really any better method as far as I know.


I'd like to preserve the name (`t` != `T`) but `alias T = T!()` 
gives me `Error: declaration `T` is already defined`