我创建了一个实现Atkin筛选以找到素数的类。该类存储结果并提供" isPrime"方法。我还想添加一个范围,允许您迭代质数。我在考虑这样的事情:
@property auto iter() { return filter!(this.isPrime)(iota(2, max, 1)); }
不幸的是,这不起作用:
Error: function primes.primes.isPrime (ulong i) is not callable using argument types ()
Error: expected 1 function arguments, not 0
没有"这"我得到了
Error: this for isPrime needs to be type primes not type Result
有没有办法将成员函数作为模板参数传递?
答案 0 :(得分:7)
您不能将方法(委托)用于模板参数,因为它们需要一个在编译时不知道的上下文。
您可以使isPrime
成为静态方法或自由函数(然后删除this.
并且您的代码可以正常工作),或者(如果方法不是故意的),请使用匿名委托文字:
@property auto iter() { return filter!((x) { return isPrime(x); })(iota(2, max, 1)); }
在2.058中你可以写:
@property auto iter() { return filter!(x => isPrime(x))(iota(2, max, 1)); }
答案 1 :(得分:1)
你需要传递函数的地址,否则编译器认为你想用0参数调用函数然后传递结果
@property auto iter() { return filter!(&isPrime)(iota(2, max, 1)); }