模板化方法指针 - 无法匹配函数参数的指针

Templated method pointer - can't match pointer for function argument

我正在制作这样的方法指针包装器:

template<typename OBJECT, typename... ARGS>
method_wrapper<ARGS...> _getWrapper(OBJECT* object, void (OBJECT::*method)(ARGS...))
{
    //irrelevant
}

问题出在调用_getWrapper:

class TestClass
{

    void TestMethod(int a, float b, bool c)
    {
        std::cout<<a<<std::endl;
        std::cout<<b<<std::endl;
        std::cout<<c<<std::endl;
    }
};

int main()
{
TestClass testObj;

method_wrapper<int, float, bool> wrap = _getWrapper<int, float, bool>(&testObj, TestClass::TestMethod);

wrap.callInternal(1000, 3.14, true);

//...

system("pause");

return 0;
}

无论我尝试以何种方式在 _getWrapper 中传递参数,它仍然告诉我:

no instance of overloaded function matches the argument list

OBJECT::*method不直接匹配TestClass::TestMethod吗?我也试了&TestClass::TestMethod,也不对。

您在调用 _getWrapper 时显式指定了模板参数,而模板参数 OBJECT 的第一个参数指定为 int,这是错误的。因为成员指针不能引用 non-class 类型。

改变

_getWrapper<int, float, bool>(&testObj, TestClass::TestMethod)

_getWrapper<TestClass, int, float, bool>(&testObj, &TestClass::TestMethod)
//          ~~~~~~~~~~

请注意,您可以只依赖 template type deduction,例如

_getWrapper(&testObj, &TestClass::TestMethod)

顺便说一句:要从成员那里获取地址,您应该始终使用 &
顺便说一句:我想 TestClass::TestMethodpublic.