检查模板参数是否对应于函数指针

问题描述 投票:0回答:1

我怎样才能做到这一点?目前出现以下编译错误

error: member pointer refers into non-class type 'Test *'
    6 |     if constexpr (std::is_same<MethodT, void (ObjectT::*)(int)>::value)
#include <type_traits>

template<typename MethodT, typename ObjectT>
void RegisterCallback(MethodT method, ObjectT object)
{
   if constexpr (std::is_same<MethodT, void (ObjectT::*)(int)>::value)
   {
    // do something
   }
   if constexpr (std::is_same<MethodT, void (ObjectT::*)(int, float)>::value)
   {
    // do something else
   }
}

int main()
{
   struct Test
   {
    void HandleCallbackWithInt(int)
    {}

    void HandleCallbackWithIntFloat(int, float)
    {}

   } receiver;

   RegisterCallback(&Test::HandleCallbackWithInt, &receiver);

   return 0;
}
c++17
1个回答
1
投票

当您将

&receiver
传递给
ObjectT object
时,
ObjectT
会被推导为
Test*
,并且
ObjectT::*
对于指针类型
ObjectT
无效。你可能想要

template<typename MethodT, typename ObjectT>
void RegisterCallback(MethodT method, ObjectT* object)
// ------------------------------------------^

ObjectT
将被推导为
Test

© www.soinside.com 2019 - 2024. All rights reserved.