由于我无法比较std::function
对象,只能存储成员函数和函数,因此我尝试创建自己的类。在遇到问题的地方,我必须相互比较不同类的函数和成员函数。我考虑过以下解决方案,但不确定是否有效:
template<class ClassT, class RetT, class... Args>
uint32_t getMethodAddress(RetT(ClassT::*mFunc)(Args...))
{
union Method
{
RetT(ClassT::*mFunc)(Args...);
uint32_t address;
};
return Method{ mFunc }.address;
}
是否可以通过uint32_t
保存每个方法的地址,并且我可以将该地址与其他函数和方法进行比较而不会感到惊讶吗?
如果有人想知道课程的样子:
// Function.hpp
template<class RetT, class... Args>
class Function
{
public:
explicit Function(RetT(*func)(Args...))
{
_in::Function<RetT, Args...>* pTmp{ new _in::Function<RetT, Args...>{ func } };
_pFunc = pTmp;
}
template<class ClassT>
explicit Function(ClassT* pObj, RetT(ClassT::*mFunc)(Args...))
{
_in::MFunction<ClassT, RetT, Args...>* pTmp{ new _in::MFunction<ClassT, RetT, Args...>{ pObj, mFunc } };
_pFunc = pTmp;
}
RetT operator()(Args... args)
{
return (*_pFunc)(args...);
}
bool operator==(const Function& rhs)
{
return _pFunc->addr() == rhs._pFunc->addr(); // Is that valid?
}
private:
_in::BaseFunction<RetT, Args...>* _pFunc{ nullptr };
};