source: src/CodePatterns/Creator.hpp@ c1e104

Last change on this file since c1e104 was 9b8fa4, checked in by Frederik Heber <heber@…>, 14 years ago

Huge update of file structure to place installation header files into right folder.

  • The problem ist that we desire use as include "CodePatterns/...". For this to work, especially with the new Observer subfolder structure, it has been necessary to place all header files away from their source files into a distinct folder called CodePatterns. This emulates the later, after make install present structure.
  • essentially all source and header files had to be changed to adapt the include.
  • all Makefile.am's had to be changed.
  • nobase_ ... was removed such that header files are installed flat and not creating their subfolder along the process.
  • We placed Observer into its own convenience library and own folder Observer away from Patterns.

Some other changes:

  • FIX: MemDebug.hpp inclusion has been removed in all stubs.
  • Property mode set to 100644
File size: 1.7 KB
Line 
1/*
2 * Creator.hpp
3 *
4 * Created on: Jan 3, 2011
5 * Author: heber
6 */
7
8#ifndef CREATOR_HPP_
9#define CREATOR_HPP_
10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16/** \section <Creator> (Creator Howto)
17 *
18 * This pattern is sometimes called 'type erasure': we want to present
19 * the user with a abstract interface only (name) but in
20 * order to create a copy (such that handed out instances are independent from
21 * one another) we have to know about the type of underlying (complex) class.
22 *
23 * Hence, we create this templated creator class (Creator<name,T>), which has an
24 * abstract creation interface (ICreator<name>). name distinguishes distinct
25 * ICreator interface classes, the second template argument T is the wrapped
26 * class to create by Creator.
27 *
28 * This pattern is e.g. very useful when multiple (proto)types have to be
29 * stored in the table of a factory. Factories can serve only a general
30 * (abstract) type and not the specific one due to a necessary general function
31 * signature.
32 *
33 * <h1> Howto </h1>
34 *
35 * simply include "Creator.hpp" in your file and inherit it, e.g.
36 * @code
37 * template <class T>
38 * class MyParticularType :
39 * public CommonInterface,
40 * public Creator<
41 * CommonInterface,
42 * MyParticularType<T> >
43 * {};
44 * @encode
45 * i.e. here MyParticularType will wrap all desired types T, where
46 * CommonInterface is an abstract base class that defines all stuff common
47 * for all possible types T.
48 *
49 */
50template <class name>
51struct ICreator
52{
53 virtual ~ICreator() {}
54 virtual name * create() const =0;
55};
56
57template <class name, class T>
58struct Creator : public ICreator<name>
59{
60 virtual name * create() const {
61 return new T();
62 }
63};
64
65
66#endif /* CREATOR_HPP_ */
Note: See TracBrowser for help on using the repository browser.