接口模板作为函数参数的语法

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.

的实例时,你会得到更好的错误消息