#if _MSC_VER >= 1900
#define _CONST_EXPR constexpr
#define _NO_EXCEPT noexcept
#else
#define _CONST_EXPR inline
#define _NO_EXCEPT throw()
#endif
#define MYLIB_START namespace myLib{
#define MYLIB_END }
MYLIB_START
template<typename _FuncTy>
struct _get;
template<typename _RetTy, typename... paramsTy>
struct _get<_RetTy(*)(paramsTy...)>
{
static size_t const value = sizeof...(paramsTy);
};
template<typename _FuncTy>
_CONST_EXPR size_t getParamNum(_FuncTy) noexcept
{
return _get<_FuncTy>::value;
}
MYLIB_END
#undef MYLIB_START
#undef MYLIB_END
#define _NO_EXCEPT noexcept
#else
#define _CONST_EXPR inline
#define _NO_EXCEPT throw()
#endif
#define MYLIB_START namespace myLib{
#define MYLIB_END }
MYLIB_START
template<typename _FuncTy>
struct _get;
template<typename _RetTy, typename... paramsTy>
struct _get<_RetTy(*)(paramsTy...)>
{
static size_t const value = sizeof...(paramsTy);
};
template<typename _FuncTy>
_CONST_EXPR size_t getParamNum(_FuncTy) noexcept
{
return _get<_FuncTy>::value;
}
MYLIB_END
#undef MYLIB_START
#undef MYLIB_END
int testFunc0()
{
return 0;
}
{
return 0;
}
int testFunc1(int i, int k)
{
return 0;
}
{
return 0;
}
int testFunc2(int i, int k, int c)
{
return 0;
}
{
return 0;
}
void main()
{
size_t i0 = myLib::getParamNum(testFunc0);
size_t i1 = myLib::getParamNum(testFunc1);
size_t i2 = myLib::getParamNum(testFunc2);
}
{
size_t i0 = myLib::getParamNum(testFunc0);
size_t i1 = myLib::getParamNum(testFunc1);
size_t i2 = myLib::getParamNum(testFunc2);
}