delegate (расширения компонентов C++)
Объявляет тип, представляющий указатель функции.
Все среды выполнения
И Среда выполнения Windows, и среда CLR поддерживают делегаты.
Заметки
delegate — это контекстно-зависимое ключевое слово.Для получения дополнительной информации см. Контекстные ключевые слова (расширения компонентов C++).
Для обнаружения во время компиляции, является ли тип делегатом, используйте характеристики типа __is_delegate().Для получения дополнительной информации см. Поддержка характеристик типов компилятором (расширения компонентов C++).
среда выполнения Windows
C++/CX поддерживает делегаты следующим синтаксисом.
Синтаксис
access delegate return-type delegate-type-identifier ([ parameters ])
Параметры
access
(необязательно) Доступность делегата, который может быть public (по умолчанию) или private.Прототип функции может также содержать ключевое слово const или volatile.return-type
Тип возвращаемого значения прототипа функции.delegate-type-identifier
Имя объявленного типа делегата.parameters
(Необязательно) Типы и идентификаторы прототипа функции.
Заметки
Используйте delegate-type-identifier для объявления события с тем же прототипом, что и у делегата.Дополнительные сведения см. в разделе Делегаты (C++/CX).
Требования
Параметр компилятора: /ZW
Среда CLR
Среда CLR поддерживает делегаты со следующим синтаксисом.
Синтаксис
access delegate function_declaration
Параметры
access
(необязательно) Доступность делегата вне сборки может быть в открытом и закрытом доступе.По умолчанию используется закрытый тип доступа.Внутри класса делегат может обладать любым типом доступа.function_declaration
Сигнатура функции, которая может быть привязана к делегату.Тип возвращаемого значения делегата может быть любым управляемым типом.Во избежание проблем взаимодействия, в качестве типа возвращаемого значения делегата рекомендуется тип CLS.Для определения непривязанного делегата первый параметр в function_declaration должен быть типом указателя this для объекта.Для получения дополнительной информации см. Несвязанный делегаты.
Заметки
Делегаты являются многоадресным: "указатель на функцию" можно привязать к одному или нескольким методам в управляемый класс.Ключевое слово delegate определяет тип множественного делегата с определенной сигнатурой метода.
Делегат может также привязать к методу класса значений, такому как статический метод.
Делегат обладает следующими характеристиками:
Он наследуется от System::MulticastDelegate.
Он имеет конструктор, который принимает два аргумента: указатель на управляемый класс или NULL (в случае привязки к статическому методу) и полный метод указанного типа.
Он содержит метод Invoke, чья сигнатура соответствует объявленной сигнатуре делегата.
При вызове делегата его функция(и) вызываются в том порядке, в котором они были присоединены.
Возвращаемое значение делегата — это возвращаемое значение из последнего подключенного функции-члена.
Делегаты не могут быть перегружены.
Делегаты могут быть привязанными или несвязанными.
После создания привязанного делегата, первым аргументом будет ссылка на объект.Второй аргумент создания делегата будет или адрес метода объекта управляемого класса, или указатель на метод типа значения.Второй аргумент создания делегата должен иметь имя метода с полным синтаксисом области класса и применять оператор address-of.
При создании экземпляра несвязанного делегата первым аргументом будет или адрес метода объекта управляемого класса, или указатель на метод типа значения.Аргумент должен быть именем метода с полным синтаксисом области класса и применять оператор address-of.
При создании делегата статической или глобальной функции нужен только один параметр: функция (при необходимости адрес функции).
Дополнительные сведения о делегатах см. в разделах
Требования
Параметр компилятора: /clr
Примеры
Пример
В следующем примере показано объявление, инициализация и вызов делегата.
// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;
// declare a delegate
public delegate void MyDel(int i);
ref class A {
public:
void func1(int i) {
Console::WriteLine("in func1 {0}", i);
}
void func2(int i) {
Console::WriteLine("in func2 {0}", i);
}
static void func3(int i) {
Console::WriteLine("in static func3 {0}", i);
}
};
int main () {
A ^ a = gcnew A;
// declare a delegate instance
MyDel^ DelInst;
// test if delegate is initialized
if (DelInst)
DelInst(7);
// assigning to delegate
DelInst = gcnew MyDel(a, &A::func1);
// invoke delegate
if (DelInst)
DelInst(8);
// add a function
DelInst += gcnew MyDel(a, &A::func2);
DelInst(9);
// remove a function
DelInst -= gcnew MyDel(a, &A::func1);
// invoke delegate with Invoke
DelInst->Invoke(10);
// make delegate to static function
MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
StaticDelInst(11);
}
Вывод