Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You have to pass the class type of the derived. To not break the typedef-way, you can can give that parameter a default value. Something like the following should work </p> <pre><code>template&lt;typename Object, typename Data, typename Derived = void&gt; class Callback; namespace detail { template&lt;typename Object, typename Data, typename Derived&gt; struct derived { typedef Derived derived_type; }; template&lt;typename Object, typename Data&gt; struct derived&lt;Object, Data, void&gt; { typedef Callback&lt;Object, Data, void&gt; derived_type; }; } template&lt;typename Object, typename Data, typename Derived&gt; class Callback : detail::derived&lt;Object, Data, Derived&gt; { typedef typename detail::derived&lt;Object, Data, Derived&gt;::derived_type derived_type; derived_type &amp;getDerived() { return static_cast&lt;derived_type&amp;&gt;(*this); } public: // ... stays unchanged ... derived_type&amp; set(PHandler handler) { pHandler = handler; return getDerived(); } void run() { (pObj-&gt;*pHandler)(&amp;getDerived()); } // ... stays unchanged ... }; </code></pre> <hr> <p>Alternatively you can simply have two classes for this. One for inheritance and one if you don't inherit. The first is for inheritance</p> <pre><code>template&lt;typename Object, typename Data, typename Derived&gt; class CallbackBase { typedef Derived derived_type; derived_type &amp;getDerived() { return static_cast&lt;derived_type&amp;&gt;(*this); } public: // ... stays unchanged ... derived_type&amp; set(PHandler handler) { pHandler = handler; return getDerived(); } void run() { (pObj-&gt;*pHandler)(&amp;getDerived()); } // ... stays unchanged ... }; </code></pre> <p>And the second is for non-inheritance. You can make use of the base-class for this</p> <pre><code>template&lt;typename Object, typename Data&gt; struct Callback : CallbackBase&lt;Object, Data, Callback&lt;Object, Data&gt; &gt; { Callback(Object* obj, PHandler handler) : Callback::CallbackBase(obj, handler) {} }; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload