2014-05-17 43 views
0

在努力保持一個圖書館中,我一直在很普通,我發現我自己寫這個龐大的代碼只是構建一個結構:防鏽:巨大的通用構造,嵌套的特質

pub struct SampleRenderer<Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> { 
    camera : Camera_T, 
    sampler : Sampler_T, 
    surface_integrator : SurfaceIntegrator_T, 
    film : Film<Filter>, 
} 

impl<Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> SampleRenderer 
    <Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> { 
    pub fn new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter> 
    (camera : Camera_T, sampler : Sampler_T, surface_integrator : SurfaceIntegrator_T, film : Film<Filter>) 
    -> SampleRenderer<Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> { 
    SampleRenderer { 
     camera : camera, 
     sampler : sampler, 
     surface_integrator : surface_integrator, 
     film : film 
    } 
    } 
} 

這枚作品,與之合作並且非常重複是一種痛苦。每個輸入都有一個與之相關的特徵,其中一些特徵也是模板化的(採樣器)。

有沒有人有更清晰的方式來表達這一點?我在看問題全是錯的嗎?

謝謝!

回答

4

您可以通過省略new()定義中的類型參數來簡化代碼,也就是說,您不需要編寫new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter>(),您可以只編寫new()。相應的參數將取自impl<...>條款。

除此之外,我認爲,你運氣不好。類型參數語法要求您輸入所有這些名稱。事實上,你也會在其他語言中做類似的事情。您可以嘗試使用更簡單的單字母名稱作爲類型參數;考慮到他們的號碼可讀性較差,但至少可以嘗試。

+1

+1以縮寫「impl」中的類型參數名(它們不必與名稱結構聲明相匹配),例如, 'impl ...'。 – huon