[英]rust: huge generic constructors, nested trait
為了保持我一直在研究的通用庫,我發現自己編寫了這段巨大的代碼來構造一個結構:
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
}
}
}
盡管這行得通,但工作起來很痛苦並且非常重復。 每個輸入都有一個與之關聯的特征,並且其中一些特征也被模板化(Sampler)。
有人有更干凈的表達方式嗎? 我看問題全錯了嗎?
謝謝!
您可以通過省略new()
定義中的類型參數來簡化代碼,即,您無需編寫new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter>()
可以只寫new()
。 相應的參數將從impl<...>
子句中獲取。
除此之外,我認為您還不走運。 類型參數語法要求您鍵入所有這些名稱。 實際上,您也將使用其他語言執行類似的操作。 您可以嘗試使用更簡單的單字母名稱作為類型參數。 給定它們的編號,可能會不太可讀,但是至少您可以嘗試一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.