Logical location of template instantiations

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 7 05:39:51 PDT 2016


On 7/7/16 7:49 AM, Tofu Ninja wrote:
> On Friday, 1 July 2016 at 19:13:45 UTC, Steven Schveighoffer wrote:
>> Emplace needs a constructor alias parameter.
>>
>> -Steve
>
> That wouldn't work as emplace wouldn't be able to use the alias if it
> was private...
>
> void main(){
>      import other;
>      test!foo();
> }
>
> private void foo(){}
> ##########
> module other;
> void test(alias pred)(){
>     pred();
> }
>
>
>
> other.d(5): Error: function main.foo is not accessible from module other
> main.d(9): Error: template instance other.test!(foo) error instantiating

Yes, it is a problem. I still don't understand how the *calling* of a 
private function is the problem, vs. the aliasing of it. Why aren't we 
preventing the aliasing of the private function in the first place (if 
not allowed)? If you can get an alias, you should be able to call it.

I understand that aliases are strange in this way. What we really need 
is an alias to the protection level. An explicit permission given to an 
external template that says "for this one instantiation, you can pretend 
you have access to this".

A workaround, of course, is to use a delegate.

I came across this when learning vibe.d, which gets around the 
requirement in an interesting way: 
https://github.com/rejectedsoftware/vibe.d/issues/1516

-Steve


More information about the Digitalmars-d mailing list