summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2018-12-30 17:32:13 +1100
committer Vas Crabb <vas@vastheman.com>2018-12-30 17:34:49 +1100
commit8ef80b186b33143d998135d296fafe305a715399 (patch)
treec39b0db0a856f1a049717c6292f3241debbb5e7d /src/lib/util
parent11936fbafd04448ee81b7719f064180183aa7d9e (diff)
(nw) So we're back to MSVC blowing up on non-trivial templates. Lovely.
Someone needs to get MS QA to put some non-trivial modern C++ compliation tests in the acceptance tests for their C++ compiler. Maybe MAME could even be a candidate. Well, that might be a plan if MS still had any QA. At least this makes some lines shorter (at the cost of needing more lines).
Diffstat (limited to 'src/lib/util')
-rw-r--r--src/lib/util/delegate.h13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/lib/util/delegate.h b/src/lib/util/delegate.h
index 8110f58f265..6b3101f5afa 100644
--- a/src/lib/util/delegate.h
+++ b/src/lib/util/delegate.h
@@ -591,17 +591,24 @@ class delegate;
template <typename ReturnType, typename... Params>
class delegate<ReturnType (Params...)> : public delegate_base<ReturnType, Params...>
{
+private:
using basetype = delegate_base<ReturnType, Params...>;
+protected:
+ template <class FunctionClass> using traits = typename basetype::template traits<FunctionClass>;
+ template <class FunctionClass> using member_func_type = typename traits<FunctionClass>::member_func_type;
+ template <class FunctionClass> using const_member_func_type = typename traits<FunctionClass>::const_member_func_type;
+ template <class FunctionClass> using static_ref_func_type = typename traits<FunctionClass>::static_ref_func_type;
+
public:
// create a standard set of constructors
delegate() : basetype() { }
explicit delegate(const basetype &src) : basetype(src) { }
delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { }
- template <class FunctionClass> delegate(typename basetype::template traits<FunctionClass>::member_func_type funcptr, FunctionClass *object) : basetype(funcptr, object) { }
- template <class FunctionClass> delegate(typename basetype::template traits<FunctionClass>::const_member_func_type funcptr, FunctionClass *object) : basetype(funcptr, object) { }
+ template <class FunctionClass> delegate(member_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
+ template <class FunctionClass> delegate(const_member_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
explicit delegate(std::function<ReturnType (Params...)> funcptr) : basetype(funcptr) { }
- template <class FunctionClass> delegate(typename basetype::template traits<FunctionClass>::static_ref_func_type funcptr, FunctionClass *object) : basetype(funcptr, object) { }
+ template <class FunctionClass> delegate(static_ref_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
delegate &operator=(const basetype &src) { *static_cast<basetype *>(this) = src; return *this; }
};