Write generic code

All Lie group & tangent classes defined in manif have in common that they inherit from a templated base class using the CRTP idiom. It allows one to write generic code abstracting the Lie group details.

Simple example

Let us write a simple function that take any group object and prints some information about it,

#include <iostream>
#include <manif/manif.h>

using namespace manif;

template <typename Derived>
void print(const LieGroupBase<Derived>& g) {
  std::cout << "Degrees of freedom: " << g::DoF << "\n"
    << "Underlying representation vector size: " << g::RepSize << "\n"
    << "Current values: " << g << "\n;
}

int main() {
  SE2d p_2d;
  print(p_2d);

  SE3d p_3d;
  print(p_3d);
}

Multiple templated arguments

Let us write a function that takes two group objects and performs some computation,

#include <manif/manif.h>

using namespace manif;

template <typename DerivedA, typename DerivedB>
typename DerivedA::Scalar ominusSquaredWeightedNorm(
  const LieGroupBase<DerivedA>& state,
  const LieGroupBase<DerivedB>& state_other
) {
  return (state - state_other).squaredWeightedNorm();
}

int main() {
  SE2d state = SE2d::Random();

  SE2d::DataType state_other_data = SE2d::DataType::Random();

  Eigen::Map<SE2d> state_other_map(state_other_data.data());

  double osn = ominusSquaredWeightedNorm(state, state_other_map);

  ...
}