考虑以下代码:

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
}

现在,我希望编译器推断出consume将被实例化为
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);

它也会编译,并且Debug writeln会按预期输出char。我是否在推理规则中缺少某些内容,还是刚刚遇到了编译器中的错误?

哦是的:
$ dmd -v
DMD64 D Compiler v2.053
...

最佳答案

我不能说这是否是一个错误,但是这是一种解决方法,它不会强制您指定类型或更改参数的顺序。将consume的签名更改为:

S consume (S, U) (ref S data, Regex!U rg) if (is(U == Unqual!(typeof(S.init[0]))))

关于D函数模板和类型推断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6427557/

10-11 03:00
查看更多