Рассмотрим следующий код:
module ftwr;
import std.regex;
import std.stdio;
import std.conv;
import std.traits;
S consume (S) (ref S data, Regex ! ( Unqual!(typeof(S.init[0])) ) rg)
{
writeln (typeid(Unqual!(typeof(S.init[0]))));
auto m = match(data, rg);
return m.hit;
}
void main()
{
auto data = "binary large object";
auto rx = regex(".*");
consume (data, rx); // this line is mentioned in the error message
}
Теперь я ожидаю, что компилятор сделает вывод, что require
должен быть создан как
string consume!(string)(string, Regex!(char))
, но этого, похоже, не происходит. Ошибки заключаются в следующем:
func_template_with_regex.d(24): Error: template ftwr.consume(S) does not match any function template declaration
func_template_with_regex.d(24): Error: template ftwr.consume(S) cannot deduce template function from argument types !()(string,Regex!(char))
и я вижу, что типы параметров верны ... Я пробовал несколько вариантов сигнатуры функции, например:
S consume (S) (Regex ! ( Unqual!(typeof(S.init[0])) ) rg, ref S data)
, которая также не компилируется (идея заключалась в том, чтобы изменить порядок аргументов) и
immutable(S)[] consume (S) (Regex ! ( S ) rg, ref immutable(S)[] data)
, который правильно компилирует и выводит типы. Если я указываю тип явно в вызове, то есть
consume!string(data, rx);
, он также компилируется, и отладка Writeln
выводит char
, как и ожидалось. Мне что-то не хватает в правилах вывода, или я только что обнаружил ошибку в компиляторе?
О да:
$ dmd -v
DMD64 D Compiler v2.053
...