Should templates have the instantiating scope's protection access rights?
Tofu Ninja via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jul 6 01:45:25 PDT 2016
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.
More information about the Digitalmars-d
mailing list