#include <iostream>
template<typename ... AA>
using hfX = void(*)(AA ... );
void hf1 (int a)
{ std::cout<< "hf1"<<std::endl; }
void hf2 (int a, int i)
{ std::cout<< "hf2 "<<i<<std::endl;}
template <typename Tf, Tf F>
class Collection;
template <typename ... I, hfX<I...> F>
class Collection<hfX<I...>, F>
{
public:
int i_=56;
template <std::size_t N = sizeof...(I)>
typename std::enable_if<N == 1U, void>::type test ()
{
F(0);
}
template <std::size_t N = sizeof...(I)>
typename std::enable_if<N == 2U, void>::type test ()
{
F(0,i_+1);
}
};
int main ()
{
Collection<hfX<int>, hf1> c1;
Collection<hfX<int,int>, hf2> c2;
c1.test(); // print "hf1"
c2.test(); // print "hf2 57"
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCnRlbXBsYXRlPHR5cGVuYW1lIC4uLiBBQT4KdXNpbmcgaGZYID0gdm9pZCgqKShBQSAuLi4gKTsKCnZvaWQgaGYxIChpbnQgYSkKIHsgc3RkOjpjb3V0PDwgImhmMSI8PHN0ZDo6ZW5kbDsgfQoKdm9pZCBoZjIgKGludCBhLCBpbnQgaSkKIHsgc3RkOjpjb3V0PDwgImhmMiAiPDxpPDxzdGQ6OmVuZGw7fQoKdGVtcGxhdGUgPHR5cGVuYW1lIFRmLCBUZiBGPgpjbGFzcyBDb2xsZWN0aW9uOwoKdGVtcGxhdGUgPHR5cGVuYW1lIC4uLiBJLCBoZlg8SS4uLj4gRj4KY2xhc3MgQ29sbGVjdGlvbjxoZlg8SS4uLj4sIEY+CiB7CiAgIHB1YmxpYzogCiAgICAgIGludCBpXz01NjsKCiAgICAgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOID0gc2l6ZW9mLi4uKEkpPgogICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxOID09IDFVLCB2b2lkPjo6dHlwZSB0ZXN0ICgpCiAgICAgICB7CiAgICAgICAJICAgIEYoMCk7CiAgICAgICB9CgogICAgICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTiA9IHNpemVvZi4uLihJKT4KICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8TiA9PSAyVSwgdm9pZD46OnR5cGUgdGVzdCAoKQogICAgICAgewogICAgICAgICAgIEYoMCxpXysxKTsKICAgICAgIH0KIH07CgppbnQgbWFpbiAoKQogewogICBDb2xsZWN0aW9uPGhmWDxpbnQ+LCBoZjE+ICAgICAgIGMxOwogICBDb2xsZWN0aW9uPGhmWDxpbnQsaW50PiwgaGYyPiAgYzI7CgogICBjMS50ZXN0KCk7IC8vIHByaW50ICJoZjEiCiAgIGMyLnRlc3QoKTsgLy8gcHJpbnQgImhmMiA1NyIKIH0=