VeNToR
VeNToR

Reputation: 33

How can solve vs2019 C++ template function trait problem?

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;
}

Upvotes: 1

Views: 236

Answers (1)

Ted Lyngmo
Ted Lyngmo

Reputation: 117278

You need to add the template keyword to make argument a dependent template name:

template <
    typename    _ChClass,
    typename    _ChFunction>
void ChTemplate(
    _ChClass    cl,
    _ChFunction fn)
{
    typename function_traits<_ChFunction>::template argument<0>  a;
    //                                     ^^^^^^^^
}

Demo

Upvotes: 2

Related Questions