#include <iostream>
#include <type_traits>
#include <iomanip>
template <typename Functor>
struct tester : std::integral_constant<int, 0>{};
template <typename Res, typename... Args>
struct tester<Res(Args...)> : std::integral_constant<int, 1>{};
template <typename Res, typename... Args>
struct tester<Res(Args......)> : std::integral_constant<int, 2>{};
#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)
#define TEST_PARAM_1 void(*)(int, int)
#define TEST_PARAM_2 void(int, char, std::ostream&)
#define TEST_PARAM_3 void()
int main(){
using std::setw;
std::cout
<< setw(65)<< STR(TEST_PARAM_1) ": " << tester<TEST_PARAM_1>::value << "\n"
<< setw(65)<< STR(TEST_PARAM_2) ": " << tester<TEST_PARAM_2>::value << "\n"
<< setw(65)<< STR(TEST_PARAM_3) ": " << tester<TEST_PARAM_3>::value << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxpb21hbmlwPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+CnN0cnVjdCB0ZXN0ZXIgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgMD57fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBSZXMsIHR5cGVuYW1lLi4uIEFyZ3M+CnN0cnVjdCB0ZXN0ZXI8UmVzKEFyZ3MuLi4pPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCAxPnt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFJlcywgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IHRlc3RlcjxSZXMoQXJncy4uLi4uLik+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDI+e307CgojZGVmaW5lIFNUUl9FWFBBTkQodG9rKSAjdG9rCiNkZWZpbmUgU1RSKHRvaykgU1RSX0VYUEFORCh0b2spCiNkZWZpbmUgVEVTVF9QQVJBTV8xIHZvaWQoKikoaW50LCBpbnQpCiNkZWZpbmUgVEVTVF9QQVJBTV8yIHZvaWQoaW50LCBjaGFyLCBzdGQ6Om9zdHJlYW0mKQojZGVmaW5lIFRFU1RfUEFSQU1fMyB2b2lkKCkKCmludCBtYWluKCl7CiAgICB1c2luZyBzdGQ6OnNldHc7CiAgICBzdGQ6OmNvdXQKICAgIDw8IHNldHcoNjUpPDwgU1RSKFRFU1RfUEFSQU1fMSkgIjogIiA8PCB0ZXN0ZXI8VEVTVF9QQVJBTV8xPjo6dmFsdWUgPDwgIlxuIgogICAgPDwgc2V0dyg2NSk8PCBTVFIoVEVTVF9QQVJBTV8yKSAiOiAiIDw8IHRlc3RlcjxURVNUX1BBUkFNXzI+Ojp2YWx1ZSA8PCAiXG4iCiAgICA8PCBzZXR3KDY1KTw8IFNUUihURVNUX1BBUkFNXzMpICI6ICIgPDwgdGVzdGVyPFRFU1RfUEFSQU1fMz46OnZhbHVlIDw8ICJcbiI7Cn0=