For a simple curve like on the BL, BGV and CLV type of roof then a cylinder to the radius of the curve is what I would use. Remove the faces you don't need then extrude along normals or use the solidify modifier to add thickness of the roof.
For compound curves like the SX carriages then I would still start with a cylinder the scale it flat in the vertical axis and for the edges at the sides where the curve is a sharper radius I would manipulate the vertices manually and eyeball it.
As for the curved ends, I would just extrude the ends of the 'main' roof section and the scale or manually manipulate the vertices to resemble your references.
BLV type roofs are basically 2 different roofs joined together. I would make them as separate objects and then join them together.
If using blender then you only need to model half the roof with the mirror modifier applied along the Y axis. This way you only have to model one side and the other side will be identical. Once the roof is finished, 'Apply' the mirror modifier to create a single roof mesh.
There is no 'right' or 'wrong' way but 'any' way that ends up with the result you want. There are heaps of tutorials on youtube on making curves using different techniques. Unless you have shop drawings or you can measure your subject personally with a tape measure, you are inevitably going to end up having to 'eyeball' it. The old adage if it looks right then it is right holds true here.
At the risk of sounding like a broken record, I suggest using Shape File Manager to view other models in wire frame mode to see how other modellers have built their roofs and do the same on your models.