|
<html>
<head>
<title>Delegate<R (T1, T2, ..., TN)></title>
<meta http-equiv=Content-Language content=en-us>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<style> <!-- body { font-family: Verdana; font-size: 10pt }
code { font-family: Lucida Console; font-size: 10pt }
h3 { color: #0000FF }
pre { font-family: Lucida Console; font-size: 10pt; border: 0.5pt solid #808080; padding: 6pt; background-color: #F0F0F0 }
-->
</style>
</head>
<body>
<h1>Delegate<R (T1, T2, ..., TN)> Class</h1>
<p>Represents a function object which encapsulates an invocation list, each of which is a C++
callable entity (static function, member function or function object).</p>
<h2>Synopsis</h2>
<pre>
<font color="blue">namespace</font> Acf {
<font color="blue">template</font> <<font color="blue">class</font> TSignature>
<font color="blue">class</font> Delegate; <font color=darkgreen>// no body</font>
<font color="blue">template</font> <<font color="blue">class</font> R, <font color="blue">class</font> T1, <font color="blue">class</font> T2, ..., <font color="blue">class</font> TN>
<font color="blue">class</font> Delegate<R (T1, T2, ..., TN)> {
<font color="darkgreen">// Constructor/Destructor</font>
<font color="blue">public</font>:
Delegate();
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
Delegate(<font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TPtr, <font color="blue">class</font> TFunctionPtr>
Delegate(<FONT color=blue>const</FONT> TPtr& obj, TFunctionPtr mfp);
Delegate(<font color="blue">const</font> Delegate& d);
~Delegate();
<font color=darkgreen>// Properties</font>
<font color="blue">public</font>:
<font color="blue">bool</font> IsEmpty() <font color="blue">const</font>;
<font color="blue">bool</font> IsMulticast() <font color="blue">const</font>;
<font color=darkgreen>// Methods</font>
<font color="blue">public</font>:
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">void</font> Add(<font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TPtr, <font color="blue">class</font> TFunctionPtr>
<font color="blue">void</font> Add(<FONT color=blue>const</FONT> TPtr& obj, TFunctionPtr mfp);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">bool</font> Remove(<font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TPtr, <font color="blue">class</font> TFunctionPtr>
<font color="blue">bool</font> Remove(<FONT color=blue>const</FONT> TPtr& obj, TFunctionPtr mfp);
<font color="blue">void</font> Clear();
<font color=darkgreen>// Operators</font>
<font color="blue">public</font>:
<font color="blue">operator</font> <font color="blue">bool</font>() <font color="blue">const</font>;
<font color="blue">bool</font> <font color="blue">operator</font>!() <font color="blue">const</font>;
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
Delegate& <font color="blue">operator</font>=(<font color="blue">const</font> TFunctor& f);
Delegate& <font color="blue">operator</font>=(<font color="blue">const</font> Delegate& d);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
Delegate& <font color="blue">operator</font>+=(<font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">friend</font> Delegate <font color="blue">operator</font>+(<font color="blue">const</font> Delegate& d, <font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">friend</font> Delegate <font color="blue">operator</font>+(<font color="blue">const</font> TFunctor& f, <font color="blue">const</font> Delegate& d);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
Delegate& <font color="blue">operator</font>-=(<font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
Delegate <font color="blue">operator</font>-(<font color="blue">const</font> TFunctor& f) <FONT color=blue>const</FONT>;
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">friend</font> <font color="blue">bool</font> <font color="blue">operator</font>==(<font color="blue">const</font> Delegate& d, <font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">friend</font> <font color="blue">bool</font> <font color="blue">operator</font>==(<font color="blue">const</font> TFunctor& f, <font color="blue">const</font> Delegate& d);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">friend</font> <font color="blue">bool</font> <font color="blue">operator</font>!=(<font color="blue">const</font> Delegate& d, <font color="blue">const</font> TFunctor& f);
<font color="blue">template</font> <<font color="blue">class</font> TFunctor>
<font color="blue">friend</font> <font color="blue">bool</font> <font color="blue">operator</font>!=(<font color="blue">const</font> TFunctor& f, <font color="blue">const</font> Delegate& d);
R <font color="blue">operator</font>()(T1, T2, ..., TN) <font color="blue">const</font>;
};
} <font color=darkgreen>// namespace Acf</font>
</pre>
<h2>Examples</h2>
<p><b>1. Using delegates</b></p>
<pre>
<font color="blue">static</font> <font color="blue">void</font> H() { ... }
<font color="blue">class</font> Foo {
<font color="blue">public</font>:
<font color="blue">void</font> G() { ... }
};
<font color="blue">class</font> Foo2 {
<font color="blue">public</font>:
<font color="blue">void</font> <font color="blue">operator</font>()(<font color="blue">int</font> n) { ... }
};
<font color=darkgreen>// Create delegate a which attaches to a static function</font>
Delegate<<font color="blue">void</font> ()> a(&H);
assert(a == &H);
<font color=darkgreen>// Create delegate b which attaches to an instance and a member function</font>
Foo foo;
Delegate<<font color="blue">void</font> ()> b(&foo, &Foo::G);
assert(b == std::make_pair(&foo, &Foo::G);
<font color=darkgreen>// Create delegate c from a</font>
Delegate<<font color="blue">void</font> ()> c = a;
assert(c == &H);
<font color=darkgreen>// Create delegate d which attaches to a function object</font>
Delegate<<font color="blue">void</font> (<font color="blue">int</font>)> d(Foo2());
<font color=darkgreen>// Call delegate</font>
a();
d(<font color="darkred">100</font>);
<font color=darkgreen>// Combine/remove delegates</font>
d += &H;
d += std::make_pair(&foo, &Foo::G);
d -= std::make_pair(&foo, &Foo::G);
d -= &H;
</pre>
<p><b>2. Using events</b></p>
<pre><font color="blue">static</font> <font color="blue">void</font> Hello(Button*, ClickEventArgs* args) { ... }
<font color="blue">typedef</font> Delegate<<font color="blue">void</font> (Button*, ClickEventArgs*)> ClickEventHandler;
<font color="blue">class</font> Button {
<font color="blue">public</font>:
ClickEventHandler Click;
<font color="blue">void</font> OnClick() { <font color="blue">this</font>->Click(<font color="blue">this</font>, NULL); }
};
Button b;
b.Click += &Hello;
b.OnClick();
b.Click -= &Hello;
</pre>
</body>
</html>
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.