//
//---- begin file library.h ----
//
#include <string>
#include <map>
#include <iostream>
typedef void(*policyFunction)();
typedef std::map<std::string, policyFunction> policyMap_t;
// singleton class to manage policies
class Policies {
public:
void registerPolicy(const std::string id,
const policyFunction func);
void policy(const std::string id) const;
static Policies& policyMap();
private:
Policies() {}
policyMap_t typeMap_;
};
// member function definitions
void
Policies::registerPolicy(const std::string id,
const policyFunction func)
{
if (id != "" && func !=0) {
typeMap_[id] = func;
}
}
void Policies::policy(const std::string id) const
{
policyMap_t::const_iterator iter = typeMap_.find(id);
if (iter != typeMap_.end()) {
(*iter).second();
}
else {
std::cout << "Performing Default Policy."
<< std::endl << std::endl;
}
}
Policies& Policies::policyMap()
{
static Policies typeMap;
return typeMap;
}
// namespace scope function for convenience
Policies& policyMap()
{
return Policies::policyMap();
}
//
//---- begin file container.h ----
//
#include "library.h"
#include <string>
#include <iostream>
template <class ElementType>
class MyContainer {
public:
MyContainer(const std::string iName) : instanceName(iName)
{}
// class implementation
// ...
// forwards the policy request
void doPolicy();
// a service that uses the policy
void performService() { doPolicy(); }
const std::string instanceName;
};
// elements for example's sake
template<class T>
struct Element1 {
// ...
};
template<class T>
struct Element2 {
// ...
};
template <class ElementType>
void MyContainer<ElementType>::doPolicy()
{
policyMap().policy("MyContainer");
}
//
//---- begin file user.cpp ----
//
#include "container.h"
void MyPolicy()
{
std::cout << "Performing My Policy."
<< std::endl << std::endl;
}
int main() {
MyContainer<Element1<int> > c("test object");
c.doPolicy();
policyMap().registerPolicy("MyContainer", MyPolicy);
c.doPolicy();
return 0;
}
End of Listing