繁体   English   中英

锈:庞大的泛型构造函数,嵌套特征

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM