#pragma once #include namespace floatpump { struct ICalibrator { virtual ~ICalibrator() = default; virtual auto translate(double measurand) -> double = 0; }; struct LinearCalibrator { LinearCalibrator(std::pair, std::pair>); auto translate(double measurand) -> double; private: std::pair, std::pair> _calibration_points; double _a; double _b; }; template class Calibrator : public ICalibrator { public: template explicit Calibrator(As&&... args) { _internal_calibrator = std::make_unique(std::forward(args)...); } double translate(double measurand) override { return _internal_calibrator->translate(measurand); } private: std::unique_ptr _internal_calibrator; }; }