template <typename Class, typename Ret, typename... Args, typename Qual>
class mem_fun_overload_element_impl<Class, Ret(Args...), Qual> {
using mem_fun_type = AddFunctionQualifiers<Ret(Class::*)(Args...), Qual>;
public:
mem_fun_overload_element_impl() = delete;
template <typename T,
DisableIf<is_related<mem_fun_overload_element_impl, T>> = {}>
explicit mem_fun_overload_element_impl(T&& t)
: mem_fun_ptr(std::forward<T>(t)) {}
#ifndef WHEELS_NO_RVALUE_THIS
template <typename Q = Qual,
EnableIf<Not<is_rref_qualifier<Q>>> = {}>
#endif // WHEELS_NO_RVALUE_THIS
Ret operator()(AddCvQualifiers<Class, Qual>& c, Args&&... args) const {
return (c.*mem_fun_ptr)(std::forward<Args>(args)...);
}
#ifndef WHEELS_NO_RVALUE_THIS
template <typename Q = Qual,
EnableIf<Not<is_lref_qualifier<Q>>> = {}>
#endif // WHEELS_NO_RVALUE_THIS
Ret operator()(AddCvQualifiers<Class, Qual>&& c, Args&&... args) const {
return (std::move(c).*mem_fun_ptr)(std::forward<Args>(args)...);
}
Ret operator()(AddCvQualifiers<Class, Qual>* c, Args&&... args) const {
return (c->*mem_fun_ptr)(std::forward<Args>(args)...);
}
private:
mem_fun_type mem_fun_ptr;
};
ICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFJldCwgdHlwZW5hbWUuLi4gQXJncywgdHlwZW5hbWUgUXVhbD4KICAgICAgICBjbGFzcyBtZW1fZnVuX292ZXJsb2FkX2VsZW1lbnRfaW1wbDxDbGFzcywgUmV0KEFyZ3MuLi4pLCBRdWFsPiB7CiAgICAgICAgICAgIHVzaW5nIG1lbV9mdW5fdHlwZSA9IEFkZEZ1bmN0aW9uUXVhbGlmaWVyczxSZXQoQ2xhc3M6OiopKEFyZ3MuLi4pLCBRdWFsPjsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIG1lbV9mdW5fb3ZlcmxvYWRfZWxlbWVudF9pbXBsKCkgPSBkZWxldGU7CiAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULAogICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZUlmPGlzX3JlbGF0ZWQ8bWVtX2Z1bl9vdmVybG9hZF9lbGVtZW50X2ltcGwsIFQ+PiA9IHt9PgogICAgICAgICAgICBleHBsaWNpdCBtZW1fZnVuX292ZXJsb2FkX2VsZW1lbnRfaW1wbChUJiYgdCkKICAgICAgICAgICAgOiBtZW1fZnVuX3B0cihzdGQ6OmZvcndhcmQ8VD4odCkpIHt9CiNpZm5kZWYgV0hFRUxTX05PX1JWQUxVRV9USElTCiAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBRID0gUXVhbCwKICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZUlmPE5vdDxpc19ycmVmX3F1YWxpZmllcjxRPj4+ID0ge30+CiNlbmRpZiAvLyBXSEVFTFNfTk9fUlZBTFVFX1RISVMKICAgICAgICAgICAgUmV0IG9wZXJhdG9yKCkoQWRkQ3ZRdWFsaWZpZXJzPENsYXNzLCBRdWFsPiYgYywgQXJncyYmLi4uIGFyZ3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgIHJldHVybiAoYy4qbWVtX2Z1bl9wdHIpKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICAgICAgICAgIH0KI2lmbmRlZiBXSEVFTFNfTk9fUlZBTFVFX1RISVMKICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFEgPSBRdWFsLAogICAgICAgICAgICAgICAgICAgICAgRW5hYmxlSWY8Tm90PGlzX2xyZWZfcXVhbGlmaWVyPFE+Pj4gPSB7fT4KI2VuZGlmIC8vIFdIRUVMU19OT19SVkFMVUVfVEhJUwogICAgICAgICAgICBSZXQgb3BlcmF0b3IoKShBZGRDdlF1YWxpZmllcnM8Q2xhc3MsIFF1YWw+JiYgYywgQXJncyYmLi4uIGFyZ3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjptb3ZlKGMpLiptZW1fZnVuX3B0cikoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZXQgb3BlcmF0b3IoKShBZGRDdlF1YWxpZmllcnM8Q2xhc3MsIFF1YWw+KiBjLCBBcmdzJiYuLi4gYXJncykgY29uc3QgewogICAgICAgICAgICAgICAgcmV0dXJuIChjLT4qbWVtX2Z1bl9wdHIpKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICAgICAgICAgIH0KICAgICAgICBwcml2YXRlOgogICAgICAgICAgICBtZW1fZnVuX3R5cGUgbWVtX2Z1bl9wdHI7CiAgICAgICAgfTsK