#include <type_traits>
#include <iostream>
int foo(int a, int b)
{
return 1;
}
//int foo(int a, int b, bool c)
//{
// return 0;
//}
template <typename R, typename ... Types>
constexpr size_t getArgumentCount(R(*)(Types ...))
{
return sizeof...(Types);
}
template <bool ... bools>
static int fooImpl(int a, int b) {
return foo(a, b, bools...);
}
template<int N>
static int setupTempl(int a, int b, typename std::enable_if<N == 3, void>::type* = nullptr)
{
return fooImpl<true>(a, b);
}
template<int N>
static int setupTempl(int a, int b, typename std::enable_if<N == 2, void>::type* = nullptr)
{
return fooImpl<>(a, b); // fooImpl(a, b)
}
int main()
{
setupTempl<getArgumentCount(foo)>(1, 2);
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgZm9vKGludCBhLCBpbnQgYikKewogICAgIHJldHVybiAxOwp9CgovL2ludCBmb28oaW50IGEsIGludCBiLCBib29sIGMpCi8vewovLyAgICByZXR1cm4gMDsKLy99Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgLi4uIFR5cGVzPgpjb25zdGV4cHIgc2l6ZV90IGdldEFyZ3VtZW50Q291bnQoUigqKShUeXBlcyAuLi4pKQp7CiAgICByZXR1cm4gc2l6ZW9mLi4uKFR5cGVzKTsKfQoKdGVtcGxhdGUgPGJvb2wgLi4uIGJvb2xzPgogICAgc3RhdGljIGludCBmb29JbXBsKGludCBhLCBpbnQgYikgewogICAgCXJldHVybiBmb28oYSwgYiwgYm9vbHMuLi4pOwp9Cgp0ZW1wbGF0ZTxpbnQgTj4Kc3RhdGljIGludCBzZXR1cFRlbXBsKGludCBhLCBpbnQgYiwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8TiA9PSAzLCB2b2lkPjo6dHlwZSogPSBudWxscHRyKQp7CiAgICAgcmV0dXJuIGZvb0ltcGw8dHJ1ZT4oYSwgYik7Cn0KCnRlbXBsYXRlPGludCBOPgpzdGF0aWMgaW50IHNldHVwVGVtcGwoaW50IGEsIGludCBiLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxOID09IDIsIHZvaWQ+Ojp0eXBlKiA9IG51bGxwdHIpCnsKICAgICByZXR1cm4gZm9vSW1wbDw+KGEsIGIpOyAvLyBmb29JbXBsKGEsIGIpCn0KCmludCBtYWluKCkKewogICAgIHNldHVwVGVtcGw8Z2V0QXJndW1lbnRDb3VudChmb28pPigxLCAyKTsKICAgICAKICAgICByZXR1cm4gMDsKfQo=