接口模板作为函数参数的语法
Syntax for interface templates as function parameters
界面模板如下所示:
interface TemplateInterface(T) {
T x();
}
这个接口需要作为函数的参数使用,但我想避免在函数签名中定义模板类型。有什么方法可以让函数签名接受传递给函数的任何模板类型,就像模板函数一样?
例如:
// no good, do not want to constrain template type at this point
void func1(TemplateInterface!int parm1) {...
// this would be better, but the syntax is wrong apparently
void func1(TemplateInterface parm1) {...
我相信你想要的是
void func1 (T) (TemplateInterface!T parm1) {...
这里,func1
有一个编译时参数T
,用于参数的类型TemplateInterface!T
,还有一个运行-时间参数parm1
上述类型。
一个更完整的例子:
import std.stdio;
interface TemplateInterface(T) {
T x();
}
class Instance(T) : TemplateInterface !(T) {
T x() {return cast (T) (1.2345);}
}
void func1 (T) (TemplateInterface!T parm1) {
writeln (typeof(parm1.x()).stringof, " ", parm1.x());
}
void main() {
auto a = new Instance !(int) ();
auto b = new Instance !(real) ();
func1(a); // int 1
func1(b); // real 1.2345
}
您可以使用带有模板约束的模板函数来实现:
import std.traits: isInstanceOf;
interface TemplateInterface(T) {
T x();
}
void func1(TemplateInterfaceInstance)(TemplateInterfaceInstance parm1)
if(isInstanceOf!(TemplateInterface, TemplateInterfaceInstance))
{ ...
模板约束并不是严格需要的,但是当你试图将一些东西传递给 func1
而不是 TemplateInterface
.
的实例时,你会得到更好的错误消息
界面模板如下所示:
interface TemplateInterface(T) {
T x();
}
这个接口需要作为函数的参数使用,但我想避免在函数签名中定义模板类型。有什么方法可以让函数签名接受传递给函数的任何模板类型,就像模板函数一样?
例如:
// no good, do not want to constrain template type at this point
void func1(TemplateInterface!int parm1) {...
// this would be better, but the syntax is wrong apparently
void func1(TemplateInterface parm1) {...
我相信你想要的是
void func1 (T) (TemplateInterface!T parm1) {...
这里,func1
有一个编译时参数T
,用于参数的类型TemplateInterface!T
,还有一个运行-时间参数parm1
上述类型。
一个更完整的例子:
import std.stdio;
interface TemplateInterface(T) {
T x();
}
class Instance(T) : TemplateInterface !(T) {
T x() {return cast (T) (1.2345);}
}
void func1 (T) (TemplateInterface!T parm1) {
writeln (typeof(parm1.x()).stringof, " ", parm1.x());
}
void main() {
auto a = new Instance !(int) ();
auto b = new Instance !(real) ();
func1(a); // int 1
func1(b); // real 1.2345
}
您可以使用带有模板约束的模板函数来实现:
import std.traits: isInstanceOf;
interface TemplateInterface(T) {
T x();
}
void func1(TemplateInterfaceInstance)(TemplateInterfaceInstance parm1)
if(isInstanceOf!(TemplateInterface, TemplateInterfaceInstance))
{ ...
模板约束并不是严格需要的,但是当你试图将一些东西传递给 func1
而不是 TemplateInterface
.