mirror of
https://github.com/holub/mame
synced 2025-06-03 19:36:26 +03:00
(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).
This commit is contained in:
parent
11936fbafd
commit
8ef80b186b
@ -42,11 +42,15 @@ protected:
|
|||||||
template <typename Signature>
|
template <typename Signature>
|
||||||
class named_delegate : public delegate<Signature>
|
class named_delegate : public delegate<Signature>
|
||||||
{
|
{
|
||||||
protected:
|
private:
|
||||||
using basetype = delegate<Signature>;
|
using basetype = delegate<Signature>;
|
||||||
template <class FunctionClass> using member_func_type = typename basetype::template traits<FunctionClass>::member_func_type;
|
|
||||||
template <class FunctionClass> using const_member_func_type = typename basetype::template traits<FunctionClass>::const_member_func_type;
|
const char * m_name; // name string
|
||||||
template <class FunctionClass> using static_ref_func_type = typename basetype::template traits<FunctionClass>::static_ref_func_type;
|
|
||||||
|
protected:
|
||||||
|
template <class FunctionClass> using member_func_type = typename basetype::template member_func_type<FunctionClass>;
|
||||||
|
template <class FunctionClass> using const_member_func_type = typename basetype::template const_member_func_type<FunctionClass>;
|
||||||
|
template <class FunctionClass> using static_ref_func_type = typename basetype::template static_ref_func_type<FunctionClass>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// create a standard set of constructors
|
// create a standard set of constructors
|
||||||
@ -60,9 +64,6 @@ public:
|
|||||||
named_delegate &operator=(const basetype &src) { basetype::operator=(src); m_name = src.m_name; return *this; }
|
named_delegate &operator=(const basetype &src) { basetype::operator=(src); m_name = src.m_name; return *this; }
|
||||||
|
|
||||||
const char *name() const { return m_name; }
|
const char *name() const { return m_name; }
|
||||||
|
|
||||||
private:
|
|
||||||
const char * m_name; // name string
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// ======================> device_delegate
|
// ======================> device_delegate
|
||||||
|
@ -591,17 +591,24 @@ class delegate;
|
|||||||
template <typename ReturnType, typename... Params>
|
template <typename ReturnType, typename... Params>
|
||||||
class delegate<ReturnType (Params...)> : public delegate_base<ReturnType, Params...>
|
class delegate<ReturnType (Params...)> : public delegate_base<ReturnType, Params...>
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
using basetype = delegate_base<ReturnType, Params...>;
|
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:
|
public:
|
||||||
// create a standard set of constructors
|
// create a standard set of constructors
|
||||||
delegate() : basetype() { }
|
delegate() : basetype() { }
|
||||||
explicit delegate(const basetype &src) : basetype(src) { }
|
explicit delegate(const basetype &src) : basetype(src) { }
|
||||||
delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { }
|
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(member_func_type<FunctionClass> 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(const_member_func_type<FunctionClass> funcptr, FunctionClass *object) : basetype(funcptr, object) { }
|
||||||
explicit delegate(std::function<ReturnType (Params...)> funcptr) : basetype(funcptr) { }
|
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; }
|
delegate &operator=(const basetype &src) { *static_cast<basetype *>(this) = src; return *this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user