Как вы можете проверить, являются ли методы одинаковыми, если вы не знаете соответствующий класс? - PullRequest
2 голосов
/ 16 марта 2019

Поскольку я не могу сравнивать 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 };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...