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