diff options
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 |
commit | 8ef80b186b33143d998135d296fafe305a715399 (patch) | |
tree | c39b0db0a856f1a049717c6292f3241debbb5e7d /src/lib/util | |
parent | 11936fbafd04448ee81b7719f064180183aa7d9e (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.h | 13 |
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; } }; |