- #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=