Поскольку я не могу сравнивать 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 };
};