[英]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.