Design patterns implemented in C++14
npm install design-patterns-cpp14
bash
$ git clone --recursive https://github.com/makiolo/design-patterns-cpp14.git dp14
$ cd dp14
$ ./cmaki/run.sh
`
$3
option 1*: use DEFINE_KEY(classname or anything) within the class
option 2*: use DEFINE_HASH(classname well qualified) outside of class
option 3*: specialization of std::hash. This is equivalent to option 2 but without use macros:
`CPP
namespace std {
template <>
struct hash
{
size_t operator()() const
{
return std::hash()("MyClass");
}
};
}
`
$3
`CPP
#include
#include
#include
class Base
{
public:
using factory = dp14::factory ;
explicit Base(const std::string& name, int q)
: _name(name)
, _q(q)
{
std::cout << "constructor " << _name << " - " << _q << std::endl;
}
virtual ~Base() { std::cout << "destruction" << std::endl; }
protected:
std::string _name;
int _q;
};
class A : public Base
{
public:
DEFINE_KEY(A)
explicit A(const std::string& name, int q) : Base(name, q) { ; }
virtual ~A() = default;
};
DEFINE_HASH(A)
// if you dont like macro DEFINE_KEY(class), can use this:
class B : public Base
{
public:
explicit B(const std::string& name, int q) : Base(name, q) { ; }
virtual ~B() = default;
};
namespace std {
template <>
struct hash
{
size_t operator()() const
{
return std::hash()("B");
}
};
}
int main()
{
Base::factory factory;
Base::factory::registrator reg1(factory);
Base::factory::registrator reg2(factory);
{
// equivalent ways of create A
std::shared_ptr a1 = factory.create("first parameter", 2);
std::shared_ptr a2 = factory.create("first parameter", 2);
std::shared_ptr a3 = factory.create("A", "first parameter", 2);
// equivalent ways of create B
std::shared_ptr b1 = factory.create("first parameter", 2);
std::shared_ptr b2 = factory.create("first parameter", 2);
std::shared_ptr b3 = factory.create("B", "first parameter", 2);
assert(a1 != a2);
assert(a3 != b1);
assert(b1 != b2);
}
return(0);
}
`
$3
`CPP
#include
#include
#include
#include
class Base
{
public:
using memoize = dp14::memoize ;
explicit Base(const std::string& name, int q)
: _name(name)
, _q(q)
{
std::cout << "constructor " << _name << " - " << _q << std::endl;
}
virtual ~Base() { std::cout << "destruction" << std::endl; }
protected:
std::string _name;
int _q;
};
class A : public Base
{
public:
DEFINE_KEY(A)
explicit A(const std::string& name, int q) : Base(name, q) { ; }
virtual ~A() = default;
};
class B : public Base
{
public:
DEFINE_KEY(B)
explicit B(const std::string& name, int q) : Base(name, q) { ; }
virtual ~B() = default;
};
int main()
{
Base::memoize m;
Base::memoize::registrator reg1(m);
Base::memoize::registrator reg2(m);
{
std::shared_ptr a1 = m.get("first parameter", 2);
assert( m.exists("first parameter", 2) == true );
}
assert( m.exists("first parameter", 2) == false );
{
std::shared_ptr a1 = m.get("first parameter", 2);
std::shared_ptr a2 = m.get("first parameter", 2);
assert(a1 == a2);
std::shared_ptr a3 = m.get("A", "first parameter", 4);
assert(a2 != a3);
std::shared_ptr b1 = m.get("first parameter", 2);
std::shared_ptr b2 = m.get("first parameter", 2);
assert(b1 == b2);
std::shared_ptr b3 = m.get("B", "first parameter", 4);
assert(b2 != b3);
assert( m.exists("first parameter", 2) == true );
}
assert( m.exists("first parameter", 2) == false );
return(0);
}
``