#include <iostream>
#include <vector>
#include <functional>
// initial declaration
template <typename... T> struct X;
// default (does nothing)
template<> struct X<>
{
};
// initial type and zero-or-more following types
template <typename H, typename... T>
struct X<H*, T...> : public X<T...>
{
H* value;
X(H* value, T... args)
: value(value), X<T...>(args...)
{
}
};
template <typename H, typename... T>
std::ostream& operator<<(std::ostream& stream, X<H*,T...> const & x)
{
return stream << "specialized scalar pointer";
}
template <typename V, typename... T>
std::ostream& operator<<(std::ostream& stream, X<std::vector<V*>*, T...> const & x)
{
return stream << "specialized vector pointer";
}
int main()
{
double a,b;
X<double*,double*> x (&a,&b);
std::vector<double *> v;
X<std::vector<double*>*, double*> y (&v, &b);
std::cout << x << std::endl;
std::cout << y << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCi8vIGluaXRpYWwgZGVjbGFyYXRpb24KdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+IHN0cnVjdCBYOwoKLy8gZGVmYXVsdCAoZG9lcyBub3RoaW5nKQp0ZW1wbGF0ZTw+IHN0cnVjdCBYPD4Kewp9OwoKLy8gaW5pdGlhbCB0eXBlIGFuZCB6ZXJvLW9yLW1vcmUgZm9sbG93aW5nIHR5cGVzCnRlbXBsYXRlIDx0eXBlbmFtZSBILCB0eXBlbmFtZS4uLiBUPgpzdHJ1Y3QgWDxIKiwgVC4uLj4gOiBwdWJsaWMgWDxULi4uPgp7CiAgICBIKiB2YWx1ZTsKICAgIFgoSCogdmFsdWUsIFQuLi4gYXJncykKICAgICAgIDogdmFsdWUodmFsdWUpLCBYPFQuLi4+KGFyZ3MuLi4pCiAgICB7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSCwgdHlwZW5hbWUuLi4gVD4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBYPEgqLFQuLi4+IGNvbnN0ICYgeCkKewogICAgcmV0dXJuIHN0cmVhbSA8PCAic3BlY2lhbGl6ZWQgc2NhbGFyIHBvaW50ZXIiOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgViwgdHlwZW5hbWUuLi4gVD4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBYPHN0ZDo6dmVjdG9yPFYqPiosIFQuLi4+ICBjb25zdCAmIHgpCnsKICAgIHJldHVybiBzdHJlYW0gPDwgInNwZWNpYWxpemVkIHZlY3RvciBwb2ludGVyIjsKfQoKaW50IG1haW4oKQp7CiAgICBkb3VibGUgYSxiOwogICAgWDxkb3VibGUqLGRvdWJsZSo+IHggKCZhLCZiKTsKICAgIAogICAgc3RkOjp2ZWN0b3I8ZG91YmxlICo+IHY7CiAgICBYPHN0ZDo6dmVjdG9yPGRvdWJsZSo+KiwgZG91YmxlKj4geSAoJnYsICZiKTsKCiAgICBzdGQ6OmNvdXQgPDwgeCA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgeSA8PCBzdGQ6OmVuZGw7Cn0=