// Trivial example of using virtual dispatch to hide template parameters from clients, as // alluded to here: http://chapeau.freevariable.com/2009/06/a-problem-of-dependent-types.html #include #include #include class repr { public: virtual ~repr() { } virtual size_t op() = 0; }; template class concrete_repr : public repr { public: virtual ~concrete_repr() { } size_t op() { return N; } }; typedef std::tr1::shared_ptr p_repr; typedef std::list repr_list; typedef repr_list::iterator repr_it; int main(int c, char *v[]) { repr_list items; items.push_back(p_repr(new concrete_repr<2>())); items.push_back(p_repr(new concrete_repr<3>())); items.push_back(p_repr(new concrete_repr<5>())); items.push_back(p_repr(new concrete_repr<7>())); items.push_back(p_repr(new concrete_repr<11>())); for (repr_it it = items.begin(); it != items.end(); ++it) { std::cout << (*it)->op() << std::endl; } }