为了保持一个我一直在研究相当通用的库,我发现我自己编写这个巨大的代码来构造一个结构:
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
}
}
}
虽然这有效,但使用起来很麻烦并且非常重复。每个输入都有一个与之相关的特征,其中一些特征也是模板化的(采样器)。
有人有更清洁的表达方式吗?我在看问题都错了吗?
谢谢!
答案 0 :(得分:4)
您可以通过省略new()
定义中的类型参数来简化代码,也就是说,您不需要编写new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter>()
,只需编写new()
即可。相应的参数将取自impl<...>
子句。
除此之外,我认为,你运气不好。类型参数语法要求您键入所有这些名称。事实上,你也可以在其他语言中做类似的事情。您可以尝试使用更简单的单字母名称作为类型参数;鉴于它们的数量,它可读性较差,但至少你可以尝试一下。