10 template <
class TFilter>
13 template <
class TMeasurement,
class... TArgs>
14 decltype(
auto)
step(const TMeasurement &measurement, const TArgs &... args) {
15 static_cast<TFilter *
>(
this)->predict();
16 return static_cast<TFilter *
>(
this)->correct(measurement);
19 template <
class TMeasurement,
class TControl = std::tuple<>>
21 filter(const std::vector<TMeasurement> &measurements,
22 const std::vector<TControl> &controls = std::vector<std::tuple<>>()) {
24 using TState = decltype(
step(measurements.at(0)));
25 std::vector<TState> state_seq(measurements.size() + 1);
26 state_seq[0] =
static_cast<TFilter *
>(
this)->initialize();
27 auto pm = measurements.cbegin();
29 if (controls.size() == 0) {
30 std::generate_n(state_seq.begin() + 1, state_seq.size() - 1,
31 [
this, &pm]() {
return step(*(pm++)); });
decltype(auto) step(const TMeasurement &measurement, const TArgs &...args)
decltype(auto) filter(const std::vector< TMeasurement > &measurements, const std::vector< TControl > &controls=std::vector< std::tuple<>>())