123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 |
- #LyX 2.0 created this file. For more info see http://www.lyx.org/
- \lyxformat 413
- \begin_document
- \begin_header
- \textclass article
- \begin_preamble
- \usepackage{color}
- \definecolor{mygreen}{rgb}{0,0.6,0}
- \definecolor{mygray}{rgb}{0.5,0.5,0.5}
- \definecolor{mymauve}{rgb}{0.58,0,0.82}
- \lstset{ %
- backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
- basicstyle=\footnotesize, % the size of the fonts that are used for the code
- breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
- breaklines=true, % sets automatic line breaking
- captionpos=b, % sets the caption-position to bottom
- commentstyle=\color{mygreen}, % comment style
- % deletekeywords={...}, % if you want to delete keywords from the given language
- escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
- extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
- frame=single, % adds a frame around the code
- keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
- keywordstyle=\color{blue}, % keyword style
- language=C++, % the language of the code
- morekeywords={*,...}, % if you want to add more keywords to the set
- numbers=left, % where to put the line-numbers; possible values are (none, left, right)
- numbersep=5pt, % how far the line-numbers are from the code
- numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers
- rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
- showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
- showstringspaces=false, % underline spaces within strings only
- showtabs=false, % show tabs within strings adding particular underscores
- stepnumber=2, % the step between two line-numbers. If it's 1, each line will be numbered
- stringstyle=\color{mymauve}, % string literal style
- tabsize=2, % sets default tabsize to 2 spaces
- title=\lstname % show the filename of files included with \lstinputlisting; also try caption instead of title
- }
- \end_preamble
- \use_default_options true
- \maintain_unincluded_children false
- \language english
- \language_package default
- \inputencoding auto
- \fontencoding global
- \font_roman lmodern
- \font_sans lmss
- \font_typewriter lmtt
- \font_default_family default
- \use_non_tex_fonts false
- \font_sc false
- \font_osf false
- \font_sf_scale 100
- \font_tt_scale 100
- \graphics default
- \default_output_format default
- \output_sync 0
- \bibtex_command default
- \index_command default
- \paperfontsize default
- \spacing single
- \use_hyperref false
- \papersize default
- \use_geometry false
- \use_amsmath 1
- \use_esint 1
- \use_mhchem 1
- \use_mathdots 1
- \cite_engine basic
- \use_bibtopic false
- \use_indices false
- \paperorientation portrait
- \suppress_date false
- \use_refstyle 1
- \index Index
- \shortcut idx
- \color #008000
- \end_index
- \secnumdepth 3
- \tocdepth 3
- \paragraph_separation indent
- \paragraph_indentation default
- \quotes_language english
- \papercolumns 1
- \papersides 1
- \paperpagestyle default
- \tracking_changes false
- \output_changes false
- \html_math_output 0
- \html_css_as_file 0
- \html_be_strict false
- \end_header
- \begin_body
- \begin_layout Section
- Template Classes
- \end_layout
- \begin_layout Standard
- Templated classes are great for writing generic code for multiple types
- (e.g.
- the same elimination algorithm code for symbolic, discrete, and Gaussian
- elimination) without the drawbacks of virtual inheritance (which include
- rigid class interfaces, downcasting from returned base class pointers,
- and additional runtime overhead).
- Depending on how they're used, though, templates can result in very slow
- compile times, large binary files, and hard-to-use code.
- This section describes the
- \begin_inset Quotes eld
- \end_inset
- best practices
- \begin_inset Quotes erd
- \end_inset
- we have developed for gaining the benefits of templates without the drawbacks.
- \end_layout
- \begin_layout Standard
- If you need to write generic code or classes, here are several programming
- patterns we have found to work very well:
- \end_layout
- \begin_layout Subsection
- The
- \begin_inset Quotes eld
- \end_inset
- Templated Base, Specialized Derived
- \begin_inset Quotes erd
- \end_inset
- Pattern
- \end_layout
- \begin_layout Standard
- This pattern is for when you have a generic class containing algorithm or
- data structure code that will be specialized to several types.
- The templated base class should never be used directly, instead only the
- specializations should be used.
- Some specialized types can be pre-compiled into the library, but the option
- remains to specialize new types in external libraries or projects.
- \end_layout
- \begin_layout Subsubsection
- Basic Class Structure
- \end_layout
- \begin_layout Standard
- We'll use
- \family typewriter
- FactorGraph
- \family default
- as an example.
- It is templated on the factor type stored in it and has several specializations.
- The templated base class
- \family typewriter
- FactorGraph<class FACTOR>
- \family default
- is divided into a header file (
- \family typewriter
- .h
- \family default
- ) and an
- \begin_inset Quotes eld
- \end_inset
- instantiation
- \begin_inset Quotes erd
- \end_inset
- file (
- \family typewriter
- -inst.h
- \family default
- ).
- The basic class structure is as follows.
- \begin_inset listings
- lstparams "basicstyle={\scriptsize\ttfamily},language={C++}"
- inline false
- status open
- \begin_layout Plain Layout
- // File FactorGraph.h
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- %*
- \backslash
- bfseries{
- \backslash
- emph{
- \backslash
- color{red}{// Include a minimal set of headers.
- Do not include any '-inst.h' files (this is the key to fast compiles).}}}*)
- \end_layout
- \begin_layout Plain Layout
- #include <boost/serialization/nvp.hpp>
- \end_layout
- \begin_layout Plain Layout
- ...
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- namespace gtsam {
- \end_layout
- \begin_layout Plain Layout
- /** Class description */
- \end_layout
- \begin_layout Plain Layout
- template<class FACTOR>
- \end_layout
- \begin_layout Plain Layout
- class FactorGraph
- \end_layout
- \begin_layout Plain Layout
- {
- \end_layout
- \begin_layout Plain Layout
- %*
- \backslash
- bfseries{
- \backslash
- emph{
- \backslash
- color{red}{// Make 'private' any typedefs that must be redefined in derived
- classes.
- E.g.
- 'This' in the context of the derived class should refer to the derived
- class.
- These typedefs will be used only by the generic code in this base class.}}}*)
- \end_layout
- \begin_layout Plain Layout
- private:
- \end_layout
- \begin_layout Plain Layout
- typedef FactorGraph<FACTOR> This; ///< Typedef for this class
- \end_layout
- \begin_layout Plain Layout
- typedef boost::shared_ptr<This> shared_ptr; ///< Shared pointer to
- this
- \end_layout
- \begin_layout Plain Layout
-
- \end_layout
- \begin_layout Plain Layout
- %*
- \backslash
- bfseries{
- \backslash
- emph{
- \backslash
- color{red}{// Make 'public' the typedefs that will be valid in the derived
- class.}}}*)
- \end_layout
- \begin_layout Plain Layout
- public:
- \end_layout
- \begin_layout Plain Layout
- typedef FACTOR FactorType; ///< Factor type stored in this graph
- \end_layout
- \begin_layout Plain Layout
- typedef boost::shared_ptr<FACTOR> sharedFactor; ///< Shared pointer
- to a factor
- \end_layout
- \begin_layout Plain Layout
- ...
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- %*
- \backslash
- bfseries{
- \backslash
- emph{
- \backslash
- color{red}{// Normally, data is 'protected' so the derived class can access
- it.}}}*)
- \end_layout
- \begin_layout Plain Layout
- protected:
- \end_layout
- \begin_layout Plain Layout
- /** Collection of factors */
- \end_layout
- \begin_layout Plain Layout
- std::vector<sharedFactor> factors_;
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- %*
- \backslash
- bfseries{
- \backslash
- emph{
- \backslash
- color{red}{// Make 'protected' all constructors, named constructors, or
- methods returning the base class type.
- These are not public - the derived class will call them and properly convert
- returned base classes to the derived class.}}}*)
- \end_layout
- \begin_layout Plain Layout
- /// @name Standard Constructors
- \end_layout
- \begin_layout Plain Layout
- /// @{
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- /** Default constructor */
- \end_layout
- \begin_layout Plain Layout
- FactorGraphUnordered() {}
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- /** Named constructor from iterator over factors */
- \end_layout
- \begin_layout Plain Layout
- template<typename ITERATOR>
- \end_layout
- \begin_layout Plain Layout
- static This FromIterator(ITERATOR firstFactor, ITERATOR lastFactor);
- \end_layout
- \begin_layout Plain Layout
- /// @}
- \end_layout
- \begin_layout Plain Layout
- \end_layout
- \begin_layout Plain Layout
- %*
- \backslash
- bfseries{
- \backslash
- emph{
- \backslash
- color{red}{// Make 'public' standard methods that will be available in the
- derived class's API.}}}*)
- \end_layout
- \begin_layout Plain Layout
- public:
- \end_layout
- \begin_layout Plain Layout
- /// @name Adding Factors
- \end_layout
- \begin_layout Plain Layout
- /// @{
- \end_layout
- \begin_layout Plain Layout
- /** ...
- */
- \end_layout
- \begin_layout Plain Layout
- void reserve(size_t size);
- \end_layout
- \begin_layout Plain Layout
- ...
- \end_layout
- \begin_layout Plain Layout
- /// @}
- \end_layout
- \begin_layout Plain Layout
- };
- \end_layout
- \begin_layout Plain Layout
- }
- \end_layout
- \end_inset
- \end_layout
- \end_body
- \end_document
|