tag dispatching and template meta-programming
parent
493b38ef28
commit
078a178701
|
@ -172,6 +172,44 @@ The group composition operation can be of two flavors:
|
||||||
|
|
||||||
which should be queryable by `gtsam::traits::group_flavor<T>::type`
|
which should be queryable by `gtsam::traits::group_flavor<T>::type`
|
||||||
|
|
||||||
|
A tag can be used for [tag dispatching](http://www.boost.org/community/generic_programming.html#tag_dispatching),
|
||||||
|
e.g., below is a generic compose:
|
||||||
|
|
||||||
|
```
|
||||||
|
#!c++
|
||||||
|
namespace detail {
|
||||||
|
template <class T>
|
||||||
|
T compose(const T& p, const T& q, additive_group_tag) {
|
||||||
|
return p + q;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T compose(const T& p, const T& q, multiplicative_group_tag) {
|
||||||
|
return p * q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <T>
|
||||||
|
T compose(const T& p, const T& q) {
|
||||||
|
return detail::compose(p, q, traits::group_flavor<T>::type);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Tags also facilitate meta-programming. Taking a leaf from [The boost Graph library](http://www.boost.org/doc/libs/1_40_0/boost/graph/graph_traits.hpp),
|
||||||
|
tags can be used to create useful meta-functions, like `is_lie_group`, below.
|
||||||
|
|
||||||
|
```
|
||||||
|
#!c++
|
||||||
|
template <typename T>
|
||||||
|
struct is_lie_group
|
||||||
|
: mpl::bool_<
|
||||||
|
is_convertible<
|
||||||
|
typename structure_category<T>::type,
|
||||||
|
lie_group_tag
|
||||||
|
>::value
|
||||||
|
>
|
||||||
|
{ };
|
||||||
|
```
|
||||||
|
|
||||||
Manifold Example
|
Manifold Example
|
||||||
----------------
|
----------------
|
||||||
|
|
Loading…
Reference in New Issue