0

私はコンテナー アプローチ #3 で Boost::function オブジェクトの保存を使用しようとしていますが、gcc はこれについて不平を言っています ->

EventComparator.hpp:39,34 - エラー - バイナリ式 ('const request_type' (別名 'const std::function') および 'const request_type') に対するオペランドが無効です

template<typename Callback, typename Function>
bool Comparator(const Function & lhs, const Function & rhs) {
    typedef typename std::conditional < std::is_function<Callback>::value,
            typename std::add_pointer<Callback>::type, Callback >::type request_type;
    if (const request_type * lhs_internal = lhs.template target<request_type>()) {
        if (const request_type * rhs_internal = rhs.template target<request_type>())
            return *rhs_internal == *lhs_internal;
    }
    return false;
}

template<typename ...Args>
class EventComparator : std::function<Args...> {
public:
    typedef std::function<Args...> Function;

    bool (*typeHolder)(const Function &, const Function &);
public:
    EventComparator() {
    }

    template<typename T>
    EventComparator(T function)
        : Function(function), typeHolder(Comparator<T, Function>) {
    }

    template<typename T>
    EventComparator & operator=(T function) {
        Function::operator=(function);
        typeHolder = Comparator<T, Function>;
        return *this;
    }

    friend bool operator==(const Function & lhs, const EventComparator & rhs) {
        return rhs.typeHolder(lhs, rhs);
    }

    friend bool operator==(const EventComparator & lhs, const Function & rhs) {
        return rhs == lhs;
    }

    friend void swap(EventComparator & lhs, EventComparator & rhs) {
        lhs.swap(rhs);
        lhs.typeHolder.swap(rhs.typeHolder);
    }
};
4

0 に答える 0