Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>First make generic monitor class. With power of C++11 you can do it as simple as this:</p> <pre><code>template &lt;class F&gt; struct FunctionType; template &lt;class R, class Object, class... Args&gt; struct FunctionType&lt;R (Object::*)(Args...)&gt; { typedef R return_type; }; template &lt;class R, class Object, class... Args&gt; struct FunctionType&lt;R (Object::*)(Args...) const&gt; { typedef R return_type; }; template &lt;class Object_&gt; class Monitor { public: typedef Object_ object_type; template &lt;class F, class... Args &gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f, Args... args) { critical_section cs; return (object.*f)(args...); } template &lt;class F, class... Args &gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f, Args... args) const { critical_section cs; return (object.*f)(args...); } private: object_type object; class critical_section {}; }; </code></pre> <p>Of course <code>critical_section</code> implementation is up to you. I recommend POSIX or some BOOST.</p> <p>It is ready to use right now:</p> <pre><code>Monitor&lt;std::vector&lt;int&gt; &gt; v; v.operation((void (std::vector&lt;int&gt;::*)(const int&amp;)) &amp;std::vector&lt;int&gt;::push_back, 1); v.operation((void (std::vector&lt;int&gt;::*)(const int&amp;)) &amp;std::vector&lt;int&gt;::push_back, 2); size = v.operation(&amp;std::vector&lt;int&gt;::size); std::cout &lt;&lt; size &lt;&lt; std::endl; </code></pre> <p>As you can see sometimes you'll need to explicitly state which member function you want to call - std::vector&lt;> has more than one push_back... </p> <hr> <p>For compilers which still do not support variadic template - the solution without it below - I have time for up to two arguments - it is very inconvenient - if required - add function with more arguments:</p> <pre><code>template &lt;class F&gt; struct FunctionType; template &lt;class R, class Object&gt; struct FunctionType&lt;R (Object::*)()&gt; { typedef R return_type; }; template &lt;class R, class Object&gt; struct FunctionType&lt;R (Object::*)() const&gt; { typedef R return_type; }; template &lt;class R, class Object, class Arg1&gt; struct FunctionType&lt;R (Object::*)(Arg1)&gt; { typedef R return_type; }; template &lt;class R, class Object, class Arg1&gt; struct FunctionType&lt;R (Object::*)(Arg1) const&gt; { typedef R return_type; }; template &lt;class R, class Object, class Arg1, class Arg2&gt; struct FunctionType&lt;R (Object::*)(Arg1,Arg2)&gt; { typedef R return_type; }; template &lt;class R, class Object, class Arg1, class Arg2&gt; struct FunctionType&lt;R (Object::*)(Arg1,Arg2) const&gt; { typedef R return_type; }; template &lt;class Object_&gt; class Monitor { public: typedef Object_ object_type; template &lt;class F&gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f) { critical_section cs; return (object.*f)(); } template &lt;class F&gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f) const { critical_section cs; return (object.*f)(); } template &lt;class F, class Arg1&gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f, Arg1 arg1) { critical_section cs; return (object.*f)(arg1); } template &lt;class F, class Arg1&gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f, Arg1 arg1) const { critical_section cs; return (object.*f)(arg1); } template &lt;class F, class Arg1, class Arg2&gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f, Arg1 arg1, Arg2 arg2) { critical_section cs; return (object.*f)(arg1, arg2); } template &lt;class F, class Arg1, class Arg2&gt; typename FunctionType&lt;F&gt;::return_type operation(const F&amp; f, Arg1 arg1, Arg2 arg2) const { critical_section cs; return (object.*f)(arg1, arg2); } private: object_type object; class critical_section {}; }; </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.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      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