Поделиться через


Универсальные функции (C++/CLI)

Универсальная функция - это функция, объявленная с параметрами типа. При вызове вместо параметров типа используются фактические типы.

Все платформы

Примечания

Эта функция не применяется ко всем платформам.

Среда выполнения Windows

Примечания

Данная функция не поддерживается в Среда выполнения Windows.

Требования

Параметр компилятора: /ZW

Среда CLR

Универсальная функция - это функция, объявленная с параметрами типа. При вызове вместо параметров типа используются фактические типы.

Синтаксис

[attributes] [modifiers]
return-type identifier <type-parameter identifier(s)>
[type-parameter-constraints clauses]

([formal-parameters])
{ 
   function-body 
}

Параметры

  • attributes (необязательный)
    Дополнительные описательные данные. Дополнительные сведения об атрибутах и классах атрибутов см. в атрибутах.

  • modifiers (необязательный)
    Модификаторы для функции, например static или virtual недопустимы, так как виртуальные методы могут не быть универсальными.

  • return-type
    Тип, возвращаемый методом. Если типом возвращаемого значения является void, возвращаемого значения не требуется.

  • identifier
    Имя функции.

  • type-parameter identifier(s)
    Разделенный запятыми список идентификаторов.

  • formal-parameters (необязательный)
    Список параметров.

  • type-parameter-constraints-clauses
    Указывает ограничения для типов, которые могут использоваться в качестве аргументов типа, и принимает форму, определенную в разделе Ограничения, применяемые к параметрам универсальных типов (C++/CLI).

  • function-body
    Тело метода, который может обращаться к идентификаторам параметра типа.

Примечания

Универсальные функции - функции, объявленные с параметром универсального типа. Они могут быть методами в классе или структуре, или как отдельными функциями. Одно универсальное объявление неявно объявляет семейство функций, которые отличаются только подстановкой различных фактических типов параметра вместо универсального типа.

В Visual C++, конструкторы класса или структуры могут быть не объявлены с параметрами универсального типа.

При вызове, параметр универсального типа заменяется фактическим типом. Фактический тип может быть явно указан в угловых скобках, используя синтаксис, аналогичный вызову шаблонной функции. При вызове без параметров типа, компилятор попытается вывести фактический тип из параметров в вызове функции. Если не удается логически вывести предполагаемый аргумент типа на основании используемых параметров, возникает ошибка компилятора.

Требования

Параметр компилятора: /clr

Примеры

Пример

В следующем примере кода демонстрируется универсальная функция.

// generics_generic_function_1.cpp
// compile with: /clr
generic <typename ItemType>
void G(int i) {}

ref struct A {
   generic <typename ItemType>
   void G(ItemType) {}

   generic <typename ItemType>
   static void H(int i) {}
};

int main() {
   A myObject;

   // generic function call
   myObject.G<int>(10);

   // generic function call with type parameters deduced
   myObject.G(10);

   // static generic function call
   A::H<int>(10);

   // global generic function call
   G<int>(10);
}

Пример

Универсальные функции могут перегружаться на основе сигнатуры или арности (количества параметров типа для функции). Кроме того, универсальные функции могут перегружаться с неуниверсальными функциями с таким же именем, если функции имеют отличия в некоторых параметрах типа. Например, могут быть перегружены следующие функции:

// generics_generic_function_2.cpp
// compile with: /clr /c
ref struct MyClass {
   void MyMythod(int i) {}

   generic <class T> 
   void MyMythod(int i) {}

   generic <class T, class V> 
   void MyMythod(int i) {}
};

Пример

В следующем примере используется универсальная функция, чтобы найти первый элемент массива. Объявляется MyClass, который наследуется от базового класса MyBaseClass. MyClass содержит универсальную функцию MyFunction, которая вызывает другую универсальную функцию MyBaseClassFunction в базовом классе. В main универсальная функция MyFunction вызывается с аргументами различного типа.

// generics_generic_function_3.cpp
// compile with: /clr
using namespace System;

ref class MyBaseClass {
protected:
   generic <class ItemType>
   ItemType MyBaseClassFunction(ItemType item) {
      return item;
   }
};

ref class MyClass: public MyBaseClass {
public:
   generic <class ItemType>
   ItemType MyFunction(ItemType item) {
      return MyBaseClass::MyBaseClassFunction<ItemType>(item);
   }
};

int main() {
   MyClass^ myObj = gcnew MyClass();

   // Call MyFunction using an int.
   Console::WriteLine("My function returned an int: {0}",
                           myObj->MyFunction<int>(2003));

   // Call MyFunction using a string.
   Console::WriteLine("My function returned a string: {0}",
   myObj->MyFunction<String^>("Hello generic functions!"));
}

Output

  
  

См. также

Основные понятия

Расширения компонентов для платформ среды выполнения

Другие ресурсы

Универсальные типы и методы (расширения компонентов C++)