在D中传递成员函数作为模板参数

时间:2012-01-18 13:46:43

标签: d

我创建了一个实现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

有没有办法将成员函数作为模板参数传递?

2 个答案:

答案 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)); }