Re: Template with default parameter
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
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
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
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
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
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`