# PolymorphicDelegate

<a id="polymorphicdelegate"></a>

# PolymorphicDelegate

```cpp
#include <icy/delegate.h>

template<class Class, typename RT, class PT, class IT>
struct PolymorphicDelegate
```

[Defined in src/base/include/icy/delegate.h:154](https://github.com/auscaster/icey/blob/main/src/base/include/icy/delegate.h#L154)

> **Inherits:** [`AbstractDelegate< RT, IT & >`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate)

Polymorphic function delegate.

Theis class contains a pointer to a class member that receices a derived subclass (`PT`) of the base type specified by the `IT` param.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`instance`](#instance-3) | `variable` | Declared here |
| [`method`](#method-2) | `variable` | Declared here |
| [`PolymorphicDelegate`](#polymorphicdelegate-1) | `function` | Declared here |
| [`operator()`](#operator-74) | `function` | Declared here |
| [`operator==`](#operator-75) | `function` | Declared here |
| [`~AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate-1) | `function` | Inherited from [`AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate) |
| [`operator()`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#operator-1) | `function` | Inherited from [`AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate) |
| [`operator==`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#operator-2) | `function` | Inherited from [`AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate) |

## Inherited from [`AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`~AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate-1) `virtual` `inline` |  |
| `function` | [`operator()`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#operator-1) `virtual` `const` | Invokes the underlying callable with the supplied arguments. |
| `function` | [`operator==`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#operator-2) `virtual` `const` | Compares two delegates for equality (same target function and instance). |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| `Class *` | [`instance`](#instance-3)  |  |
| `RT(Class::*` | [`method`](#method-2)  |  |

---

<a id="instance-3"></a>

### instance

```cpp
Class * instance
```

[Defined in src/base/include/icy/delegate.h:156](https://github.com/auscaster/icey/blob/main/src/base/include/icy/delegate.h#L156)

---

<a id="method-2"></a>

### method

```cpp
RT(Class::* method)(PT &)
```

[Defined in src/base/include/icy/delegate.h:157](https://github.com/auscaster/icey/blob/main/src/base/include/icy/delegate.h#L157)

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`PolymorphicDelegate`](#polymorphicdelegate-1) `inline` |  |
| `RT` | [`operator()`](#operator-74) `virtual` `const` `inline` `override` | Attempts to cast `object` to `PT`; invokes the method if successful. Returns a default-constructed `RT` if the cast fails (packet type mismatch). |
| `bool` | [`operator==`](#operator-75) `virtual` `const` `inline` `override` |  |

---

<a id="polymorphicdelegate-1"></a>

### PolymorphicDelegate

`inline`

```cpp
inline PolymorphicDelegate(Class * instance, RT(Class::*)(PT &) method)
```

[Defined in src/base/include/icy/delegate.h:161](https://github.com/auscaster/icey/blob/main/src/base/include/icy/delegate.h#L161)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `instance` | `Class *` | Object on which to invoke the member function. |
| `method` | `RT(Class::*)(PT &)` | Pointer to the member function accepting a derived `PT&`. |

---

<a id="operator-74"></a>

### operator()

`virtual` `const` `inline` `override`

```cpp
virtual inline RT operator()(IT & object) const override
```

[Defined in src/base/include/icy/delegate.h:171](https://github.com/auscaster/icey/blob/main/src/base/include/icy/delegate.h#L171)

Attempts to cast `object` to `PT`; invokes the method if successful. Returns a default-constructed `RT` if the cast fails (packet type mismatch). 
#### Returns
Method result, or default `RT` on cast failure.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `object` | `IT &` | Base-type reference; cast to `PT` before dispatch. |

---

<a id="operator-75"></a>

### operator==

`virtual` `const` `inline` `override`

```cpp
virtual inline bool operator==(const AbstractDelegate< RT, IT & > & that) const override
```

[Defined in src/base/include/icy/delegate.h:181](https://github.com/auscaster/icey/blob/main/src/base/include/icy/delegate.h#L181)

#### Returns
True if both delegates wrap the same instance/method pair.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `that` | const [`AbstractDelegate`](https://auscaster.com/icey/docs/api-reference/icy-AbstractDelegate.md#abstractdelegate)< RT, IT & > & | Other delegate to compare. |
