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 types, cv 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