22 template <
class CLASS,
typename ARG1 =
void,
typename ARG2 =
int>
26 using Ptr = std::shared_ptr<CLASS>;
30 CLASS* (*ptr_factory1)(ARG1);
31 CLASS* (*ptr_factory2)(ARG1, ARG2);
40 Ptr create(
const std::string& class_name, ARG1 a1)
const 44 throw std::runtime_error(
45 (std::string(
"ClassFactory: Unknown class ") + class_name)
47 if (!it->second.ptr_factory1)
48 throw std::runtime_error(
50 "ClassFactory: factory(1) pointer is nullptr for ") +
53 return Ptr((*it->second.ptr_factory1)(a1));
55 Ptr create(
const std::string& class_name, ARG1 a1, ARG2 a2)
const 59 throw std::runtime_error(
60 (std::string(
"ClassFactory: Unknown class ") + class_name)
62 if (!it->second.ptr_factory2)
63 throw std::runtime_error(
65 "ClassFactory: factory(2) pointer is nullptr for ") +
68 return Ptr((*it->second.ptr_factory2)(a1, a2));
75 #define DECLARES_REGISTER_CLASS1(CLASS_NAME, BASE_CLASS, ARG1) \ 77 static BASE_CLASS* Create(ARG1 a1) { return new CLASS_NAME(a1); } 78 #define DECLARES_REGISTER_CLASS2(CLASS_NAME, BASE_CLASS, ARG1, ARG2) \ 80 static BASE_CLASS* Create(ARG1 a1, ARG2 a2) \ 82 return new CLASS_NAME(a1, a2); \ 85 #define REGISTER_CLASS1(FACTORY_TYPE, FACTORY_OBJ, TEXTUAL_NAME, CLASS_NAME) \ 87 FACTORY_TYPE::TClassData data; \ 88 data.ptr_factory1 = &CLASS_NAME::Create; \ 89 FACTORY_OBJ.do_register(TEXTUAL_NAME, data); \ 92 #define REGISTER_CLASS2(FACTORY_TYPE, FACTORY_OBJ, TEXTUAL_NAME, CLASS_NAME) \ 94 FACTORY_TYPE::TClassData data; \ 95 data.ptr_factory2 = &CLASS_NAME::Create; \ 96 FACTORY_OBJ.do_register(TEXTUAL_NAME, data); \
std::map< std::string, TClassData > classes_
void do_register(const std::string &class_name, const TClassData &data)
CLASS *(* ptr_factory1)(ARG1)
std::shared_ptr< CLASS > Ptr
CLASS *(* ptr_factory2)(ARG1, ARG2)
Ptr create(const std::string &class_name, ARG1 a1, ARG2 a2) const
Ptr create(const std::string &class_name, ARG1 a1) const