#include <iostream>
template <typename...>
struct wrapper
{
static void foo() {
std::cout << "generic" << std::endl;
}
};
template<typename T>
struct wrapper<T>
{
static void foo() {
std::cout << "one argument" << std::endl;
}
};
// just an illustration
template <typename T> // <--------------------------------------------------+
struct wrapper <int, double, T> // <--- to instantiate, use this list of arguments |
{ // not this one -----------------------------+
// that is, say `wrapper<int, double, sometype>`
static void foo() {
std::cout << "three arguments (int, double, something)" << std::endl;
}
};
template <template<typename ...> class T, // <-----------------------------------------+
typename K> // |
struct wrapper<T<K>> // <--- to instantiate, use this list of arguments |
{ // not this one ------------------------------+
// that is, say `wrapper<sometemplate<sometype>>`
static void foo() {
std::cout << "the template thingy" << std::endl;
}
};
template <typename> class X {};
int main ()
{
wrapper<int, int>::foo();
wrapper<int>::foo();
wrapper<int, double, X<int>>::foo();
wrapper<X<int>>::foo();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uPgpzdHJ1Y3Qgd3JhcHBlcgp7CiAgc3RhdGljIHZvaWQgZm9vKCkgewogICAgc3RkOjpjb3V0IDw8ICJnZW5lcmljIiA8PCBzdGQ6OmVuZGw7CiAgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHdyYXBwZXI8VD4KewogIHN0YXRpYyB2b2lkIGZvbygpIHsKICAgIHN0ZDo6Y291dCA8PCAib25lIGFyZ3VtZW50IiA8PCBzdGQ6OmVuZGw7CiAgfQp9OwoKLy8ganVzdCBhbiBpbGx1c3RyYXRpb24KdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAvLyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnN0cnVjdCB3cmFwcGVyIDxpbnQsIGRvdWJsZSwgVD4gICAgLy8gPC0tLSB0byBpbnN0YW50aWF0ZSwgdXNlIHRoaXMgbGlzdCBvZiBhcmd1bWVudHMgICAgfAp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIG5vdCB0aGlzIG9uZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0aGF0IGlzLCBzYXkgYHdyYXBwZXI8aW50LCBkb3VibGUsIHNvbWV0eXBlPmAKICBzdGF0aWMgdm9pZCBmb28oKSB7CiAgICBzdGQ6OmNvdXQgPDwgInRocmVlIGFyZ3VtZW50cyAoaW50LCBkb3VibGUsIHNvbWV0aGluZykiIDw8IHN0ZDo6ZW5kbDsKICB9Cn07Cgp0ZW1wbGF0ZSA8dGVtcGxhdGU8dHlwZW5hbWUgLi4uPiBjbGFzcyBULCAgIC8vIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgdHlwZW5hbWUgSz4gICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnN0cnVjdCB3cmFwcGVyPFQ8Sz4+ICAgICAgICAgICAgICAgLy8gPC0tLSB0byBpbnN0YW50aWF0ZSwgdXNlIHRoaXMgbGlzdCBvZiBhcmd1bWVudHMgICAgfAp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbm90IHRoaXMgb25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoYXQgaXMsIHNheSBgd3JhcHBlcjxzb21ldGVtcGxhdGU8c29tZXR5cGU+PmAKICBzdGF0aWMgdm9pZCBmb28oKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJ0aGUgdGVtcGxhdGUgdGhpbmd5IiA8PCBzdGQ6OmVuZGw7CiAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBYIHt9OwoKaW50IG1haW4gKCkKewogIHdyYXBwZXI8aW50LCBpbnQ+Ojpmb28oKTsKICB3cmFwcGVyPGludD46OmZvbygpOwogIHdyYXBwZXI8aW50LCBkb3VibGUsIFg8aW50Pj46OmZvbygpOwogIHdyYXBwZXI8WDxpbnQ+Pjo6Zm9vKCk7Cn0K