I found a solution on Understanding how the function traits template works. In particular, what is the deal with the pointer to member function to get type of function parameters types by using templates. But following code gets "error C2760: syntax error: unexpected token '<', expected 'declaration'" on VS2019. It works on GCC ? When I use c++17 or c++20 gets same error. This seems vs2019 bug ?
Any suggestions ?
#include <functional>
#include <tuple>
#include <type_traits>
    
class CChTest
{
    public:
        CChTest()
        {
        }
        bool    ChDeneme(int a, int b)
        {
            return false;
        }
};
    
template<typename> struct function_traits;
template <typename Function>
struct function_traits : public function_traits<
    decltype(&std::remove_reference<Function>::type::operator())>
{
};
    
template <
    typename    ClassType,
    typename    ReturnType,
    typename... Arguments>
struct function_traits<
    ReturnType(ClassType::*)(Arguments...) const>
    : function_traits<ReturnType(*)(Arguments...)>
{
};
    
template <
    typename    ClassType,
    typename    ReturnType,
    typename... Arguments>
struct function_traits<
    ReturnType(ClassType::*)(Arguments...)>
    : function_traits<ReturnType(*)(Arguments...)>
{
};
template <
    typename    ReturnType,
    typename... Arguments>
struct function_traits<
    ReturnType(*)(Arguments...)> 
{
    typedef ReturnType result_type;
    template <std::size_t Index>
    using argument = typename std::tuple_element<
        Index,
        std::tuple<Arguments...>>::type;
    static const std::size_t arity = sizeof...(Arguments);
};
    
template <
    typename    _ChClass,
    typename    _ChFunction>
void ChTemplate(
    _ChClass    cl,
    _ChFunction fn)
{
    typename function_traits<_ChFunction>::argument<0>  a;
}
    
int main()
{
    CChTest ChTest;
    ChTemplate(&ChTest, &CChTest::ChDeneme);
    return 0;
}
 
    