Reputation: 33
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
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;
// ^^^^^^^^
}
Upvotes: 2