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


Поддержка характеристик типов компилятором (расширения компонентов C++)

Компилятор поддерживает признаки типов, которые показывают различные характеристики типа во время компиляции.

AfxWndProc

Заметки

Признаки типа особенно полезны программистам, которые записывают библиотеки.

В следующей таблице перечислены признаки типа, поддерживаемые компилятором.Все признаки типа возвращают false, если условие, указанное по имени признака типа не выполняется.

(В столбце описание таблицы, примеры кода записываются только в C++/CLI.Но соответствующий признак типа также не поддерживается в Расширения компонентов Visual C++ если указано в противном случае.Термин «тип» относится к типам платформы или Среда выполнения Windows и типами среды CLR).

Признак типа

Описание

__has_assign(type)

Возвращает значение true, если платформа или собственный тип, имеют оператор присваивания копий.

// has_assign.cpp
// compile with: /clr
ref struct R {
   void operator=(R% r) {}
};
int main() {
   System::Console::WriteLine(__has_assign(R));
}

__has_copy(type)

Возвращает значение true, если платформа или собственный тип, имеющих конструктор копий.

// has_copy.cpp
// compile with: /clr
ref struct R {
   R(R% r) {}
};
int main() {
   System::Console::WriteLine(__has_copy(R));
}

__has_finalizer(type)

(Не поддерживается в Расширения компонентов Visual C++). Возвращает true, если тип среды CLR обладает методом завершения.Дополнительные сведения см. в разделе Деструкторы и методов завершения в Visual C++.

// has_finalizer.cpp
// compile with: /clr
using namespace System;
ref struct R {
   ~R() {}
protected:
   !R() {}
};
int main() {
   Console::WriteLine(__has_finalizer(R));
}

__has_nothrow_assign(type)

Возвращает значение true, если оператор присваивания копий содержит пустую спецификация исключения.

// has_nothrow_assign.cpp
#include <stdio.h>
struct S { 
   void operator=(S& r) throw() {}
};
int main() {
   __has_nothrow_assign(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_nothrow_constructor(type)

Возвращает значение true, если конструктор по умолчанию содержит пустую спецификация исключения.

// has_nothrow_constructor.cpp
#include <stdio.h>
struct S { 
   S() throw() {}
};
int main() {
   __has_nothrow_constructor(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_nothrow_copy(type)

Возвращает значение true, если конструктор копии содержит пустую спецификация исключения.

// has_nothrow_copy.cpp
#include <stdio.h>
struct S { 
   S(S& r) throw() {}
};
int main() {
   __has_nothrow_copy(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_trivial_assign(type)

Возвращает true, если тип имеет тривиальный, компилятором оператор присваивания.

// has_trivial_assign.cpp
#include <stdio.h>
struct S {};
int main() {
   __has_trivial_assign(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_trivial_constructor(type)

Возвращает true, если тип имеет тривиальный, компилятором конструктором.

// has_trivial_constructor.cpp
#include <stdio.h>
struct S {};
int main() {
   __has_trivial_constructor(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_trivial_copy(type)

Возвращает true, если тип имеет тривиальный, компилятором конструктором копии.

// has_trivial_copy.cpp
#include <stdio.h>
struct S {};
int main() {
   __has_trivial_copy(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_trivial_destructor(type)

Возвращает true, если тип имеет тривиальный, компилятором деструктор.

// has_trivial_destructor.cpp
#include <stdio.h>
struct S {};
int main() {
   __has_trivial_destructor(S) == true ? 
      printf("true\n") : printf("false\n");
}

__has_user_destructor(type)

Возвращает значение true, если платформа или собственный тип, имеют пользователь-объявленный деструктор.

// has_user_destructor.cpp
// compile with: /clr
using namespace System;
ref class R {
   ~R() {}
};
int main() {
   Console::WriteLine(__has_user_destructor(R));
}

__has_virtual_destructor(type)

Возвращает true, если тип имеет виртуальный деструктор.

__has_virtual_destructor также работает с типами платформы и любые определяемые пользователем деструктор в типе платформы виртуальный деструктор.

// has_virtual_destructor.cpp
#include <stdio.h>
struct S {
   virtual ~S() {}
};
int main() {
   __has_virtual_destructor(S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_abstract(type)

Возвращает true, если тип абстрактным типом.Дополнительные сведения о типах рефераты собственного см. в разделе abstract (расширения компонентов C++).

__is_abstract также работает для типов платформы.Интерфейс по крайней мере с одним членом абстрактный тип, ссылочный тип с хотя бы один абстрактный элементом.Дополнительные сведения об абстрактных типах платформ см. в разделе Абстрактные классы (C++)

// is_abstract.cpp
#include <stdio.h>
struct S {
   virtual void Test() = 0;
};
int main() {
   __is_abstract(S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_base_of(base,derived)

Возвращает значение true, если первый тип второго аргумента базовый класс типа, если оба эти же типа.

__is_base_of также работает с типами платформы.Например, она возвратит true, если первый тип interface class (расширения компонентов C++) и второй тип реализует интерфейс.

// is_base_of.cpp
#include <stdio.h>
struct S {};
struct T : public S {};
int main() {
   __is_base_of(S, T) == true ? 
      printf("true\n") : printf("false\n");
   __is_base_of(S, S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_class(type)

Возвращает true, если тип собственные класса или структуры.

// is_class.cpp
#include <stdio.h>
struct S {};
int main() {
   __is_class(S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_convertible_to(from, to)

Возвращает значение true, если первый тип может быть преобразован на второй тип.

// is_convertible_to.cpp
#include <stdio.h>
struct S {};
struct T : public S {};
int main() {
   S * s = new S;
   T * t = new T;
   s = t;
   __is_convertible_to(T, S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_delegate(type)

Возвращает значение true, если type делегат.Дополнительные сведения см. в разделе delegate (расширения компонентов C++).

// is_delegate.cpp
// compile with: /clr
delegate void MyDel();
int main() {
   System::Console::WriteLine(__is_delegate(MyDel));
}

__is_empty(type)

Возвращает true, если тип не содержит члены данных экземпляра.

// is_empty.cpp
#include <stdio.h>
struct S {
   int Test() {}
   static int i;
};
int main() {
   __is_empty(S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_enum(type)

Возвращает true, если тип собственные перечисления.

// is_enum.cpp
#include <stdio.h>
enum E { a, b };
struct S {
   enum E2 { c, d };   
};
int main() {
   __is_enum(E) == true ? 
      printf("true\n") : printf("false\n");
   __is_enum(S::E2) == true ? 
      printf("true\n") : printf("false\n");
}

__is_interface_class(type)

Возвращает значение true, если передаются в интерфейсе платформы.Дополнительные сведения см. в разделе interface class (расширения компонентов C++).

// is_interface_class.cpp
// compile with: /clr
using namespace System;
interface class I {};
int main() {
   Console::WriteLine(__is_interface_class(I));
}

__is_pod(type)

Возвращает true, если тип является классом или объединение без конструктора или закрытых или защищенных non-статических элементов, нет базовых классов и без виртуальных функций.Стандарт C++, см. в разделах 8.5.1/1, 9/4 и 3.9/10 дополнительные сведения о стручках.

__is_pod возвращает значение false для основных типов.

// is_pod.cpp
#include <stdio.h>
struct S {};
int main() {
   __is_pod(S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_polymorphic(type)

Возвращает значение true, если собственный тип имеет виртуальные функции.

// is_polymorphic.cpp
#include <stdio.h>
struct S {
   virtual void Test(){}
};
int main() {
   __is_polymorphic(S) == true ? 
      printf("true\n") : printf("false\n");
}

__is_ref_array(type)

Возвращает значение true, если передается массив платформы.Дополнительные сведения см. в разделе Массивы (расширения компонентов C++).

// is_ref_array.cpp
// compile with: /clr
using namespace System;
int main() {
   array<int>^ x = gcnew array<int>(10);
   Console::WriteLine(__is_ref_array(array<int>));
}

__is_ref_class(type)

Возвращает значение true, если передаются классом ссылки.Дополнительные сведения об определяемых пользователем типах см. в разделе Классы и структуры (расширения компонентов C++) ссылочных.

// is_ref_class.cpp
// compile with: /clr
using namespace System;
ref class R {};
int main() {
   Console::WriteLine(__is_ref_class(Buffer));
   Console::WriteLine(__is_ref_class(R));
}

__is_sealed(type)

Возвращает значение true, если передаются платформе или собственный тип пометил sealed.Дополнительные сведения см. в разделе sealed (расширения компонентов C++).

// is_sealed.cpp
// compile with: /clr
ref class R sealed{};
int main() {
   System::Console::WriteLine(__is_sealed(R));
}

__is_simple_value_class(type)

Возвращает значение true, если передаются типом значения, который не содержит ссылок на мусор-собранной куче.Дополнительные сведения об определяемых пользователем типах значений см. в разделе Классы и структуры (расширения компонентов C++).

// is_simple_value_class.cpp
// compile with: /clr
using namespace System;
ref class R {};
value struct V {};
value struct V2 {
   R ^ r;   // not a simnple value type
};
int main() {
   Console::WriteLine(__is_simple_value_class(V));
   Console::WriteLine(__is_simple_value_class(V2));
}

__is_union(type)

Возвращает true, если тип соединения.

// is_union.cpp
#include <stdio.h>
union A {
   int i;
   float f;
};
int main() {
   __is_union(A) == true ? 
      printf("true\n") : printf("false\n");
}

__is_value_class(type)

Возвращает значение true, если передаются типом значения.Дополнительные сведения об определяемых пользователем типах значений см. в разделе Классы и структуры (расширения компонентов C++).

// is_value_class.cpp
// compile with: /clr
value struct V {};
int main() {
   System::Console::WriteLine(__is_value_class(V));
}

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

Заметки

Признак типа __has_finalizer(тип) не поддерживается, так как эта платформа не поддерживает методы завершения.

ms177194.collapse_all(ru-ru,VS.110).gifТребования

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

Среда CLR

Заметки

(Нет примечания платформа-специфического для этой функции).

ms177194.collapse_all(ru-ru,VS.110).gifТребования

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

ms177194.collapse_all(ru-ru,VS.110).gifПримеры

Пример

В следующем примере кода показано, как использовать шаблон класса для предоставления признак типа компилятора для компиляции /clr.Дополнительные сведения см. в разделе Среда выполнения Windows и управляемые шаблоны (расширения компонентов C++).

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

template <class T>
ref struct is_class {
   literal bool value = __is_ref_class(T);
};

ref class R {};

int main () {
   if (is_class<R>::value)
      Console::WriteLine("R is a ref class");
   else
      Console::WriteLine("R is not a ref class");
}

Output

  

См. также

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

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