Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <typename TA, typename TB>
- struct MyImpl : public MyInterface
- {
- // content
- };
- MyInterface* factory(char ta, char tb)
- {
- if(ta == 'c' && tb == 'c')
- {
- return new MyImpl<char, char>();
- }
- if(ta == 'c' && tb == 's')
- {
- return new MyImpl<char, short>();
- }
- if(ta == 's' && tb == 'c')
- {
- return new MyImpl<short, char>();
- }
- // and so on ....
- }
- template <typename T>
- MyInterface * factroy(char t)
- {
- if (t == 'c') { return MyImpl<T, char>(); }
- if (t == 's') { return MyImpl<T, short>(); }
- // ...
- }
- MyInterface * factory(char ta, char tb)
- {
- if (ta == 'c') { return factroy<char>(tb); }
- if (ta == 's') { return factroy<short>(tb); }
- // ...
- }
- struct Base { virtual ~Base() = default; };
- template <typename A, typename B, typename C> struct Foo : Base { };
- #include <tuple>
- template <typename ...Args>
- constexpr Base * factory(std::tuple<Args...>)
- {
- return new Foo<Args...>;
- }
- template <typename ...Args, typename ...Char>
- constexpr Base * factory(std::tuple<Args...>, char t, Char ... ts)
- {
- return t == 'c' ? make(std::tuple<char, Args...>(), ts...)
- : t == 's' ? make(std::tuple<short int, Args...>(), ts...)
- : t == 'i' ? make(std::tuple<int, Args...>(), ts...)
- : t == 'l' ? make(std::tuple<long int, Args...>(), ts...)
- : nullptr;
- }
- struct Creator {
- virtual ~Creator(){};
- virtual Interface *create(InterfaceInner *) = 0;
- virtual InterfaceInner *createInner() = 0;
- }
- std::Map<char, Creator *> creatorMap;
- template<char T>
- struct Factory {
- Factory() {
- creatorMap.insert(T, &this->creator);
- }
- }
- template<>
- struct Factory<'s'> {
- struct ShortCreator : public Creator {
- virtual Interface *create(InterfaceInner *inner) {return new Impl<short>(inner);}
- virtual InterfaceInner *createInner(return new ImplInner<short>());
- } creator;
- }
- Factory<'s'> shortFactory;
- Factory<'c'> charFactory;
- creatorMap[ta].create(creatorMap[tb].createInner());
- MyInterface* factory(char ta, char tb)
- {
- switch( ta << 8 | tb )
- {
- case 'cc': return MyImpl<char, char>();
- case 'cs': return MyImpl<char, short>();
- case 'sc': return MyImpl<short, char>();
- // and so on ....
- }
- }
Add Comment
Please, Sign In to add comment