我正在编写一些对静态 D 数组进行操作的向量函数,如下所示:
real[N] unit(uint N)(real[N] v) {
real[N] u = (v[] / norm(v)); //explicit type necessary to force slice-operator
return u; //to return static-length array
}
real[3] v = unit!(3)([1,2,3]); //works
real[3] w = unit([1,2,3]); //error, compiler doesn't infer the template parameter
real[3] x = [1,2,3];
auto i = unit(x); //also works, forces statically allocated array
所以,我的问题是,如果我将文字数组直接传递给函数,有没有办法让编译器推断出模板参数 N ?我尝试使用“1.0L”格式,希望该数组是从 int 或 float 的静态数组转换而来,但这也不起作用。TL;DR 我可以使上面的中间示例 (w) 工作吗? Thanks!
编辑:只是为了澄清一下,我尝试了一些带有专门模板参数的变体,但我不确定我是否正确地做到了这一点。我也尝试过,在通话中,new real[3]([1,2,3])
强制分配堆静态数组(三角独角兽?),但我无法编译它。
问题是[1,2,3]
不是静态数组。这是一个动态数组,所以它can't匹配。这是错误的类型,并且无法拥有静态数组文字。如果要将数组文字作为静态数组传递,则需要先将其分配给变量或将其转换为所需的类型。
auto w = unit(cast(real[3])[1,2,3]);
应该管用。就我个人而言,我认为最好只是显式实例化模板
auto w = unit!3([1, 2, 3]);
因为它避免了演员阵容搞砸的风险。
现在,我认为有一个明确的论点,即编译器应该在这种情况下工作,但它对模板的选择往往比对普通函数的选择要严格得多,因为它通常会使用您传递给它的确切类型来实例化模板,而无需尝试执行任何隐式转换,而普通函数会将动态数组隐式转换为静态数组。随意地打开增强请求 http://d.puremagic.com/issues。行为可能会改变。它was最近进行了更改,以便 IFTI(隐式函数模板实例化)使用数组的 tail-const 版本进行实例化(例如immutable(char)[]
代替immutable(char[])
),这是一个明显的进步。现在,这与尝试转换有点不同(我相信编译器会自动将数组视为 IFTI 的尾部常量),所以我不知道在这种情况下改变编译器行为的可能性有多大高的。但问一下也没什么坏处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)