我想将模板中函数的非限定名称引入我的工作/本地范围。例如:
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
中的所有内容我的工作范围。
请在评论中要求澄清。我的问题在我的第一次表述中很少可读。谢谢!
答案 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
功能....除非我误解了您的问题。