On Wednesday, 6 July 2016 at 08:45:25 UTC, Tofu Ninja wrote:
On Wednesday, 6 July 2016 at 08:05:38 UTC, Lodovico Giaretta wrote:
Thinking about this, maybe the choice about attributes should be made by the user, so that if I want to give emplace access to private ctors of my structs, I have to explicitly declare inside my module that I'm going to give emplace those rights (which in turn are propagated to whatever templates emplace uses internally). This way the template writer doesn't have to bother whether his template needs those rights, it is clear which templates have them without looking at their declarations, and users can decide not to grant these rights (bonus point: this way nothing changes behaviour unless the user wants so).

That is an option too. However there would still need to be some way for the rights to get carried through multiple levels of templates. I suppose retransmission could be done in two ways, explicitly or implicitly. I am not sure which way would be better.

If it was explicit, things like allocator.make would need to explicitly retransmit the access rights down to emplace. Something like :

######################################
auto make(T, A, ARGS...)(A alloc, ARGS args) {
   // ...
   emplace!(@ShareAccess T)(/* ... */);
   //...
}

// Some other module
class myClass{
    private this(int x){}
}
// ...
auto x = Mallocator.make!(@ShareAccess myClass)(5);
// Access rights get transmitted into make and then make retransmits them into emplace
######################################

If it was implicit the @ShareAccess in make would not be necessary, the access rights would carry through to emplace implicitly. I am not sure it would be a good option though because access might get accidentally granted somewhere it shouldn't.

Having it be opt-in by the user also resolves the range function example I had earlier where it needed access to mypred. In this case I think the implicit retransmission is probably better, as it would allow any range function to not care about retransmitting the rights if they pass the argument to other templates.

If mixin could work with normal templates, as well as mixin templates, the following would work:

auto make(T, A, ARGS...)(A alloc, ARGS args) {
   // ...
   mixin emplace!T(/* ... */);
   //...
}

// Some other module
class myClass{
    private this(int x){}
}
// ...
auto x = mixin Mallocator.make!myClass(5);

Reply via email to