Listing 2: Template parameter substitution implementation

#include <string>
#include <vector>
#include <map>

class gstring : public std::string {
public:
  gstring(const char* c) : std::string(c) {}
};

class gstringvector : public std::vector<std::string> {
};

#if defined(NAIVE)

typedef std::map<std::string, std::vector<std::string> >
  GeneralRegistry;

#elif defined(SMART)

typedef std::map<gstring, std::vector<std::string> >
  GeneralRegistry;

#elif defined(SMARTER)

typedef std::map<gstring, gstringvector>
  GeneralRegistry;

#endif

int main(int argc, char* argv[])
{
  GeneralRegistry gr;
  while (argc--) {
    gr[argv[argc]].push_back("value");
  }
}

}