source: src/CodePatterns/Creator.hpp@ 084729c

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 084729c was 084729c, checked in by Frederik Heber <heber@…>, 8 years ago

Squashed 'ThirdParty/CodePatterns/' content from commit c1e1041

git-subtree-dir: ThirdParty/CodePatterns
git-subtree-split: c1e10418c454f98be2f43d93167642b0008428fc

  • 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.