将模板实例化范围中的项目不合格到本地范围

时间:2015-07-24 00:14:47

标签: module namespaces scope d

我想将模板中函数的非限定名称引入我的工作/本地范围。例如:

struct St {
    int t = 44;
}

template Inter(T) { // the 'base' template/interface/parameterized-module
    alias Self = T;

    void myfunc(ref self) {
        writeln("Inter: ", Self.stringof, " : ", 11);
    }
}

template Inter(T: St) {
      /+ ^^^^^ the 'specialization' which is really
         the implementation for the template-module for type `St`
      +/
    alias Self = T;

    void myfunc(ref Self self) {
        writeln("Inter TWO (St)! : ", Self.stringof, " : ", self.t);
    }
}

void main(string[] args){
    St s;

    /+  SOMETHING HERE  +/

    /+  s.myfunc(s);  +/ // <- I want to be able to do this
}

mixin template这样的东西会起作用,但代价是大量不必要的代码重复(不会复制任何东西,但编译器必须使用大量相同的代码。)

换句话说:是的,即使我可以将myfunc(self)带入main()的范围内,UFCS甚至可能不会在这种情况下工作。但是我的问题是如何将模板范围内的内容公开/不合格地放入另一个范围?或者另一种方式:想象一下我做了一个嵌套的module (我不知道如何做到这一点)在mixin template内,用我想要的类型实例化mixin,然后import mymodule_templ!MyType中的所有内容我的工作范围。

请在评论中要求澄清。我的问题在我的第一次表述中很少可读。谢谢!

1 个答案:

答案 0 :(得分:1)

你提到了mixin template所以也许你尝试了它并且它没有用......但你所要求的正是mixin模板的作用:

import std.stdio;

struct St {
    int t = 44;
}

// it needs to be declared as a mixin template
mixin template Inter(T) {
    alias Self = T;

    void myfunc(ref self) {
        writeln("Inter: ", Self.stringof, " : ", 11);
    }
}

// the overload is also a mixin template....
mixin template Inter(T: St) {
    alias Self = T;

    void myfunc(ref Self self) {
        writeln("Inter TWO (St)! : ", Self.stringof, " : ", self.t);
    }
}


mixin Inter!St; // and this is where you mix it in to the current scope

void main(string[] args){
    St s;

    s.myfunc(); // boom, this works!
}

您也可以将它混合到main,但UFCS之所以不能在那里工作只是因为ufcs不考虑本地符号,如果您手写的话,它就不会起作用功能要么。它只关注模块级别。

所以mixin关键字是您正在寻找的import功能....除非我误解了您的问题。