Выводим тип аргумента делегата с неизвестным числом аргументов с типизированной информацией

Если вы определяете функцию, которая принимает делегата, D может вводить аргументы делегата при вызове этой функции. Так что, если я напишу функцию с подписью:

void foo(void delegate(int,string) dlg)

Я могу назвать это используя:

foo((a,b){});

и D сделает вывод, что a является int а также b является string,

Но что, если я не знаю заранее, сколько аргументов будет у делегата? если я напишу

void foo(T...)(void delegate(T) dlg)

Я могу позвонить:

foo((int a,string b,char c,boolean d){});

Но я должен был указать типы для каждого аргумента.

Теперь я хочу foo принять делегата с любым количеством аргументов - все одного типа. Так что я могу позвонить:

foo((a,b,c,d,e,f,g){});

и D сделает вывод, что a в g являются все strings.

Обратите внимание, что мне нужна не переменная функция. dlg само по себе не принимает никакого количества аргументов, это foo который принимает делегата с любым количеством аргументов.

Возможно ли сделать это в D?

РЕДАКТИРОВАТЬ:
На самом деле, было бы лучше, если бы я мог определить аргумент по умолчанию, чтобы я мог написать

foo((a,b,int c,d){});

а также a,b а также d будут строки в то время как c будет int,

1 ответ

Решение

Это может быть запрос на улучшение. Но сейчас вы можете передать его во время компиляции как псевдоним:

import std.stdio;

void foo(alias dlg)()
{
    dlg(1, 2.0, [3], "a");
    dlg(1.0, 2, [[3]], "b");
}

void main()
{
    foo!((a, b, c, d) { writefln("%s %s %s %s", a, b, c, d); } )();
}
Другие вопросы по тегам