هدر type_triats شامل یکسری struct و الگوریتم برای تشخیص type متغیر ها و داده ها و همچنین تغییر بعضی از type ها زمان کامپایل هستش .
به عنوان نمونه :
فرض کنید یک کلاس داشته باشین و بخواهید متغیر های کلاس رو به شکل unsigned ورودی template تعریف کنید میشه این جا از std::make_unsigned استفاده کرد :
template <class T>
struct Foo {
std::make_unsigned<T> data;//moadl unsigned T data
};
مثال 2 : فرض کنید یک template class دارید که از یک ورودی template ارث برده می خواهید اگر ورودی template کلاس از یک کلاس دلخواه مشتق نشده بود برنامه زمان کامپایل ارور بده :
struct Base
{};
class Drived:public Base
{};
template <class T>
struct Foo : public T
{
//inja agar T az Base inherit nashode bood error bede
};
این کار با استفاده از static_assert , is_base_of موجود در type_triats شدنیه :
#include <type_traits>
struct Base
{};
struct Drived:public Base
{};
struct C{};
template <class T>
struct Foo : public T
{
using Type=T;
static_assert(std::is_base_of<Base,T>::value,"T bayad az Base inherit shode bashad");
};
int main()
{
Foo<Drived> a;//ok
Foo<C> b;//compile time error T bayad az Base inherit shode bashad
}
مثال 3 : overload کردن براساس نوع مقدار بازگشتی از تابع ورودی
مثال 4 : تشخیص اشتباه بودن ورودی template زمان کامپایل
مثال 5 : template که روی کلاس های مشتق شده از کلاس خاص کار کند .
مثال 6: ساخت متغیر از نوع iterator یک container
لیست این توابع رو میتونین داخل این لینک ببینید : http://www.cplusplus.com/reference/type_traits/