私はコンテナー アプローチ #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);
}
};