2012-01-18 57 views
3

我創建了一個類來實現Atkin的Sieve以查找素數。該類存儲結果並提供「isPrime」方法。我還想添加一個允許您迭代素數的範圍。我在想是這樣的:將成員函數作爲模板參數傳入D

@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 

有沒有辦法通過一個成員函數作爲模板參數?

回答

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)); } 
+0

太棒了!謝謝。 – 2012-01-19 04:17:50

1

需要,否則編譯器會認爲你要調用的函數0指定參數和那麼p傳遞函數的地址屁股結果

@property auto iter() { return filter!(&isPrime)(iota(2, max, 1)); } 
相關問題