25 Nisan 2019 Perşembe

constructible traits

std::is_constructible
İmzası şöyle. Variadic'tir. is_copy_constructible ve is_move_constructible ise variadic değildir.
template <class T, class... Args> struct is_constructible;
Verilen parametreleri kullanarak sınıfın kurulup kurulamayacağını döner. Yani şu kodu yazıp yazamayacağımızı döner.
T obj();
Örnek - T tipi tam tanımlı olmalı
Elimizde şöyle bir kod olsun.
#include <iostream>

class A;

int main()
{
  std::cout << std::is_constructible<A>::value << std::endl;
}
Bu kod tanımsız davranışa sebep olur. Açıklaması şöyle.
T and all types in the template parameter pack Args shall be complete typescv void, or arrays of unknown bound.
Örnek - Destructor erişilebilir olmalı
Destructor private olduğu için is_constructible false döner
#include <type_traits>

class Foo
{
public:
  Foo() {}
private:
  // Destructor is private!
  ~Foo(){}
};

int main()
{

  if(!std::is_constructible<Foo>::value)
  {
    std::cout << "is_constructible failed" << std::endl;
  }
}
std::is_default_constructible
Açıklaması şöyle.
T shall be a complete type, (possibly cv-qualified) void, or an array of unknown bound. Otherwise, the behavior is undefined.
Bu  metod aslında altta
T obj();
tipi için std::is_constructible çağrısını kullanıyor.

Şöyle yaparız.
struct X { };  // OK
static_assert(std::is_default_constructible<X>::value, "Error"); 
Eğer T tipi tam değilse false döner. Örneğin aynı kodu X yapısı içine taşıyalım. Şöyle yaparız.
struct X {
 static_assert(std::is_default_constructible<X>::value, "Error");  // Fails
};
std::is_move_constructible
move constructible traits yazısına taşıdım.

std::is_nothrow_constructible
Verilen parametreleri kullanarak sınıfın kurulup kurulamayacağını döner. Variadic'tir. is_copy_constructible ve is_move_constructible ise variadic değildir.

Örnek ver

std::is_trivially_constructible
Verilen parametreleri kullanarak sınıfın kurulup kurulamayacağını döner. Variadic'tir. is_copy_constructible ve is_move_constructible ise variadic değildir.

Örnek ver




Hiç yorum yok:

Yorum Gönder