نقش Type Traits - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

نقش Type Traits

+3 امتیاز
سلام.

Type Traits در کامپایلر C++11 چه نقشی دارند مثل اینکه قبل ار TR1 تو c++ مباحث Type Traits نداشت. دوستان یک مقداری توضیح بدن که من هم یاد بگیرم البته با مثال (:
سوال شده خرداد 28, 1393  بوسیله ی hojat1 (امتیاز 875)   12 68 99
دوباره تگ گذاری شد خرداد 28, 1393 بوسیله ی BlueBlade

2 پاسخ

+3 امتیاز
 
بهترین پاسخ

هدر 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/

پاسخ داده شده خرداد 28, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد آبان 11, 1393 بوسیله ی hojat1
+2 امتیاز

زمانیکه قصد دارید با Type ها در template  کار کنید  مورد استفاده قرار می گیره یک مثال سادش کد زیر هستش :

template <typename T>
void foo (const T& val)
{
std::cout << (std::is_pointer<T>::value ? *val : val)
<< std::endl;
}

یعنی چه مقدار باشه و چه اشاره گر مقدار مربوط چاپ میشه.

پاسخ داده شده خرداد 28, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
...