Выводим тип аргумента делегата с неизвестным числом аргументов с типизированной информацией
Если вы определяете функцию, которая принимает делегата, 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
являются все string
s.
Обратите внимание, что мне нужна не переменная функция. 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); } )();
}