gpt4 book ai didi

templates - D 中的模板参数推断

转载 作者:行者123 更新时间:2023-12-03 08:07:42 26 4
gpt4 key购买 nike

我正在编写一些对静态 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) 工作吗? 谢谢!

编辑:澄清一下,我已经尝试了一些带有专门模板参数的变体,但我不确定我是否做对了。我也试过,在调用中,new real[3]([1,2,3]) 强制分配一个堆静态数组(三角 unicorn ?)但我无法得到编译。

最佳答案

问题是 [1,2,3] 不是静态数组。它是一个动态数组,所以它不能匹配。这是错误的类型,并且没有办法拥有静态数组文字。如果您想将数组文字作为静态数组传递,您需要先将其分配给变量或将其转换为您想要的类型。

auto w = unit(cast(real[3])[1,2,3]);

应该可以。就个人而言,我认为最好只显式实例化模板

auto w = unit!3([1, 2, 3]);

因为它避免了搞砸类型转换的风险。

现在,我认为有一个明确的论点,即编译器应该只在这种情况下工作,但它对模板比对普通函数更挑剔,因为它通常实例化模板的类型与您传递给它的类型完全相同,而不是尝试进行任何隐式转换,而普通函数会将动态数组隐式转换为静态数组。欢迎调用open an enhancement request .行为可能会改变。它最近发生了变化,因此 IFTI(隐式函数模板实例化)使用数组的尾常量版本进行实例化(例如,immutable(char)[] 而不是 immutable(char[])),这是一个明显的改进。现在,这与尝试转换有点不同(我相信编译器只是自动地,总是将数组视为 IFTI 的尾部常量),所以我不知道在这种情况下改变编译器行为的可能性非常大高的。但问问也无妨。

关于templates - D 中的模板参数推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com