On Thursday, 5 May 2016 at 16:12:40 UTC, Steven Schveighoffer wrote:
On 5/5/16 12:10 AM, Erik Smith wrote:
I want to have a struct template auto instantiate when the template
parameters are defaulted or missing.  Example:

struct Resource(T=int) {
     static auto create() {return Resource(null);}
     this(string s) {}
}

auto resource = Resource.create;

As a plain struct it works, but not as a template:

struct Resource {   // works
struct Resource() {  // fails
struct Resource(T=int) {  // fails

At the call site, this works, but I'm hoping for a few less symbols:

auto resource = Resource!().create;

Any ideas?

Instead of static method, use an external factory method:

static auto createResource(T = int)()
{
   return Resource!T(null);
}

And I wouldn't bother with making Resource's T have a default, as you'd still have to instantiate it with Resource!() to get the default.

-Steve

Alias works at the cost of adding a 2nd type name:

alias Res = Resource!();
auto res  = Res.create

The other problem is that the alias definition by itself instantiates, which I can't afford.

I have createResource() now, it just doesn't fit well with the rest of the calling styles.

There is also this approach, which might be slightly more idiomatic

struct Resource(T) {}
struct Policy {}

auto create(alias T)() {
    T!Policy r;
    return r;
}

auto r = create!Resource;





Reply via email to