Tür Özellikleri için Derleyici Desteği (C++/CLI ve C++/CX)

Microsoft C++ derleyicisi, derleme zamanında bir türün çeşitli özelliklerini gösteren C++/CLI ve C++/CX uzantıları için tür özelliklerini destekler.

Tüm Çalışma Zamanları

Açıklamalar

Tür özellikleri özellikle kitaplık yazan programcılar için yararlıdır.

Aşağıdaki liste, derleyici tarafından desteklenen tür özelliklerini içerir. Tür özelliği adıyla belirtilen koşul karşılanmazsa tüm tür özellikleri döndürülebilir false .

(Aşağıdaki listede kod örnekleri yalnızca C++/CLI dilinde yazılmıştır. Ancak ilgili tür özelliği, aksi belirtilmedikçe C++/CX'te de desteklenir. "Platform türü" terimi, Windows Çalışma Zamanı türlerini veya ortak dil çalışma zamanı türlerini ifade eder.)

  • __has_assign(type)

    Platform veya yerel türün kopyalama atama işleci varsa döndürür true .

    ref struct R {
    void operator=(R% r) {}
    };
    
    int main() {
    System::Console::WriteLine(__has_assign(R));
    }
    
  • __has_copy(type)

    Platformun veya yerel türün bir kopya oluşturucusunun olup olmadığını döndürür true .

    ref struct R {
    R(R% r) {}
    };
    
    int main() {
    System::Console::WriteLine(__has_copy(R));
    }
    
  • __has_finalizer(type)

    (C++/CX'te desteklenmez.) CLR türünün sonlandırıcısı varsa döndürür true . Daha fazla bilgi için bkz . Yıkıcılar ve sonlandırıcılar: Nasıl yapılır: Sınıfları ve yapıları (C++/CLI) tanımlama ve kullanma.

    using namespace System;
    ref struct R {
    ~R() {}
    protected:
    !R() {}
    };
    
    int main() {
    Console::WriteLine(__has_finalizer(R));
    }
    
  • __has_nothrow_assign(type)

    Kopyalama atama işlecinin özel durum belirtimi boşsa döndürür true .

    #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)

    Varsayılan oluşturucunun boş bir özel durum belirtimi varsa döndürür true .

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

    Kopyalama oluşturucusunun boş bir özel durum belirtimi varsa döndürür true .

    #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)

    Türün önemsiz, derleyici tarafından oluşturulan bir atama işleci varsa döndürür true .

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

    Türünde önemsiz, derleyici tarafından oluşturulan bir oluşturucu varsa döndürür true .

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

    Türün önemsiz, derleyici tarafından oluşturulan bir kopya oluşturucusunun olması durumunda döndürür true .

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

    Türün önemsiz, derleyici tarafından oluşturulan bir yıkıcısı varsa döndürür 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)

    Platform veya yerel türün kullanıcı tarafından bildirilen bir yıkıcısı varsa döndürür true .

    // has_user_destructor.cpp
    
    using namespace System;
    ref class R {
    ~R() {}
    };
    
    int main() {
    Console::WriteLine(__has_user_destructor(R));
    }
    
  • __has_virtual_destructor(type)

    Türün bir sanal yıkıcısı varsa döndürür true .

    __has_virtual_destructor ayrıca platform türleri üzerinde de çalışır ve platform türündeki kullanıcı tanımlı yıkıcılar sanal bir yıkıcıdır.

    // 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)

    Tür soyut bir türse döndürür true . Yerel soyut türler hakkında daha fazla bilgi için bkz . Soyut Sınıflar.

    __is_abstract ayrıca platform türleri için de çalışır. En az bir üyeye sahip arabirim, en az bir soyut üyeye sahip bir başvuru türü olduğu gibi soyut bir türdür. Soyut platform türleri hakkında daha fazla bilgi için bkz . soyut.

    // 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 )

    İlk tür ikinci türün temel sınıfıysa veya her iki tür de aynıysa döndürür true .

    __is_base_of ayrıca platform türleri üzerinde de çalışır. Örneğin, ilk tür bir arabirim sınıfıysa ve ikinci tür arabirimi uygularsa döndürürtrue.

    // 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)

    Türün yerel bir sınıf veya yapı olup olmadığını döndürür true .

    #include <stdio.h>
    struct S {};
    
    int main() {
    __is_class(S) == true ?
    printf("true\n") : printf("false\n");
    }
    
  • __is_convertible_to( from , to )

    İlk türün ikinci türe dönüştürülebildiğini döndürür true .

    #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)

    Temsilci ise type döndürürtrue. Daha fazla bilgi için bkz . temsilci (C++/CLI ve C++/CX).

    delegate void MyDel();
    int main() {
    System::Console::WriteLine(__is_delegate(MyDel));
    }
    
  • __is_empty(type)

    Türün örnek veri üyesi yoksa döndürür true .

    #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)

    Türün yerel bir sabit listesi olup olmadığını döndürür 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)

    Bir platform arabirimi geçirildiyse döndürür true . Daha fazla bilgi için bkz . arabirim sınıfı.

    // is_interface_class.cpp
    
    using namespace System;
    interface class I {};
    int main() {
    Console::WriteLine(__is_interface_class(I));
    }
    
  • __is_pod(type)

    Tür oluşturucu veya özel ya da korumalı statik olmayan üye, temel sınıf ve sanal işlev içermeyen bir sınıf veya birleşimse döndürür true . POD'lar hakkında daha fazla bilgi için C++ standardının 8.5.1/1, 9/4 ve 3.9/10 bölümlerine bakın.

    __is_pod temel türlerde false döndürür.

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

    Yerel bir türün sanal işlevleri varsa döndürür true .

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

    Bir platform dizisi geçirilirse döndürür true . Daha fazla bilgi için bkz . Diziler.

    using namespace System;
    int main() {
    array<int>^ x = gcnew array<int>(10);
    Console::WriteLine(__is_ref_array(array<int>));
    }
    
  • __is_ref_class(type)

    Bir başvuru sınıfı geçirildiyse döndürür true . Kullanıcı tanımlı başvuru türleri hakkında daha fazla bilgi için bkz . Sınıflar ve Yapılar.

    using namespace System;
    ref class R {};
    int main() {
    Console::WriteLine(__is_ref_class(Buffer));
    Console::WriteLine(__is_ref_class(R));
    }
    
  • __is_sealed(type)

    Korumalı olarak işaretlenmiş bir platform veya yerel tür geçirildiyse döndürür true . Daha fazla bilgi için bkz . korumalı.

    ref class R sealed{};
    int main() {
    System::Console::WriteLine(__is_sealed(R));
    }
    
  • __is_simple_value_class(type)

    Atık olarak toplanan yığına başvuru içermeyen bir değer türü geçirilirse döndürür true . Kullanıcı tanımlı değer türleri hakkında daha fazla bilgi için bkz . Sınıflar ve Yapılar.

    using namespace System;
    ref class R {};
    value struct V {};
    value struct V2 {
    R ^ r;   // not a simple value type
    };
    
    int main() {
    Console::WriteLine(__is_simple_value_class(V));
    Console::WriteLine(__is_simple_value_class(V2));
    }
    
  • __is_union(type)

    Bir tür birleşim ise döndürür true .

    #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)

    Bir değer türü geçirilirse döndürür true . Kullanıcı tanımlı değer türleri hakkında daha fazla bilgi için bkz . Sınıflar ve Yapılar.

    value struct V {};
    
    int main() {
    System::Console::WriteLine(__is_value_class(V));
    }
    

Windows Çalışma Zamanı

Açıklamalar

Bu __has_finalizer(platform sonlandırıcıları desteklemediğinden tür) türü özelliği desteklenmez.

Gereksinimler

Derleyici seçeneği: /ZW

Ortak Dil Çalışma Zamanı

Açıklamalar

(Bu özellik için platforma özgü bir açıklama yoktur.)

Gereksinimler

Derleyici seçeneği: /clr

Örnekler

Örnek

Aşağıdaki kod örneğinde, derleme için derleyici türü özelliğini kullanıma sunma amacıyla /clr bir sınıf şablonunun nasıl kullanılacağı gösterilmektedir. Daha fazla bilgi için bkz. Windows Çalışma Zamanı ve Yönetilen Şablonlar.

// 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");
}
R is a ref class

Ayrıca bkz.

.NET ve UWP İçin Bileşen Uzantıları