Синтаксис шаблонов интерфейса в качестве параметров функции - PullRequest
0 голосов
/ 04 мая 2018

Шаблон интерфейса выглядит так:

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) {...

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете использовать функцию шаблона с ограничением шаблона для достижения этого:

import std.traits: isInstanceOf;

interface TemplateInterface(T) {
    T x();
}

void func1(TemplateInterfaceInstance)(TemplateInterfaceInstance parm1)
        if(isInstanceOf!(TemplateInterface, TemplateInterfaceInstance))
{ ...

Ограничение на шаблон не является строго необходимым, но вы получаете лучшие сообщения об ошибках при попытке передать что-то в func1, который не является экземпляром TemplateInterface.

0 голосов
/ 04 мая 2018

Я верю, что вы хотите

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
}
...