2009-04-28 2 views
4

Я новичок в C++ Templates, и мне трудно понять и отладить их. Каковы хорошие ресурсы для обоих?Ресурсы для шаблонов C++

+0

Они довольно просты. Дайте нам код, который вы не понимаете, мы попытаемся разобраться в этом. – User

+0

Можете ли вы уточнить? Что вам нужно знать о них, и что вы не понимаете? – jalf

+0

Какой материал вы прочитали и не поняли? Там много хороших книг и онлайн-текстов, которые объясняют шаблоны. –

ответ

1

Шаблон - это просто способ уменьшить количество кода, которое необходимо написать при разработке классов.

Например СТЛ вектор

std::vector<int> intList; 
std::vector<float> floatList; 

Это заставит компилятор на самом деле сделать два класса за кулисами, подобные, если скопировать и вставить код, но заменить все ссылки на Int с поплавком.

Без шаблонов вам понадобится создать векторный класс для каждого типа, который вы хотите обработать. Для классов существует более сложное использование, но это самый простой способ использования, создать &.

После скомпилирования два набора кода для vector<int> и vector<float> полностью разделены, но при отладке среда IDE будет проходить через класс шаблона.

0

Они предназначены для расширения и модификации по мере необходимости. Помните, что это шаблон, а не решение.

НТН

4

Alexandrescu является мастер шаблонов. У него много рецензий (многие из которых свободно доступны на его веб-сайте и других сайтах) и некоторые книги.

Boost Documentation и Boost Cookbook - хороший сайт для начала, как только вы будете довольны шаблонами и почувствуете, что закончите Boost.

1

У меня есть два быстрых совета, которые могут сэкономить вам некоторые проблемы в будущем.

Шаблоны должны быть определены и реализованы в заголовках, так как они переводятся/создается во время компиляции

Если у вас есть следующий код:

// Foo.h 
template <typename T> 
class Foo 
{ 
    ... 
}; 

// Bar.cpp 
#include "Foo.h" 
void func() 
{ 
    Foo<int> fooInt; 
    Foo<double> fooDouble; 
} 

При обработке файла Bar.cpp , компилятор «создаст» новое определение класса Foo с каждым замененным T с типом int для экземпляра fooInt и новым определением класса Foo с каждым замененным T с двойным типом для экземпляра fooDouble.

В двух словах, C++ не поддерживает классы шаблонов, компилятор имитирует их, заменяя типы во время компиляции и создавая обычные классы. Таким образом, скомпилированный тип fooInt и fooDouble отличается.

Поскольку они переведены во время компиляции и не скомпилированы в отдельности, они должны быть определены и реализованы в заголовках .

Если вы реализуете класс шаблона как обычный класс (заголовок и исходный файл), то ошибка, созданная компилятором (фактически компоновщиком), заключается в том, что не реализован метод (потому что исходный файл игнорируется).

Вы можете создавать вперед декларации, чтобы избежать циклических зависимостей

Это просто, что вы должны передать их декларировать, как это:

template <typename T> 
class Foo; 

И, как и с обычными декларациями вперед, вы должны убедитесь, что вы включили все необходимые заголовки.

-1

это очень хорошо и почти лаконичная статья, чтобы узнать о C++ шаблоны
http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part

введу существенные части здесь:

1.Function шаблоны:

простой функция шаблон:

template<class TYPE> 
void PrintTwice(TYPE data) 
{ 
    cout<<"Twice: " << data * 2 << endl; 
} 

обратите внимание, что «ТИП» может быть любым другим допустимым именем.

Лучше использовать имя, которое отражает значение параметра типа, и улучшает читаемость кода.

теперь вы можете назвать это так:

PrintTwice(5.5);//TYPE is 'float' 
PrintTwice(5);//TYPE is 'int' 

вы можете заставить компилятор для конкретизации функции для данного типа вы передаете в явном виде:

PrintTwice<double>(5); 

если вы не сдадите любой тип, компилятор определяет тип.

вы можете иметь шаблоны нескольких аргументов и (необязательно) тип возвращаемого значения одного типа:

template<class T> 
T Add(T n1, T n2) 
{ 
    return n1 + n2; 
} 

, но обратите внимание, что вы не можете, например, передать n1 в int и n2 в два раза! оба аргумента должны быть одного типа, и тип возврата также относится к этому типу.

, если вы хотите иметь функцию шаблона, возможно, разного типа аргумента:

template<class T1, class T2> 
double Add(T1 t1Data, T2 t2Data) 
{ 
    return t1Data + t2Data; 
} 

и использовать его как:

cout<<Add(5,7.0);//T1=int T2=double 
cout<<Add(5.5,7);//T1=double T2=int 
cout<<Add<double,double>(5,7);//T1=double T2=double by passing types explicitly 

Когда функция-шаблон имеет шаблонный тип, но не от его аргументы функции, такие как:

template<class T> 
void PrintSize() 
{ 
    cout << "Size of this type:" << sizeof(T); 
} 

Вы не можете вызвать такой шаблон функции просто как:

PrintSize(); 

Поскольку для этого шаблона функции требуется спецификация аргумента типа шаблона, и он не может быть выведен автоматически компилятором.Правильный вызов будет:

PrintSize<float>(); 

2.class шаблоны:

определение почти аналогично:

template<class T> 
class Item 
{ 
    T Data; 
public: 
    Item() : Data(T()) 
    {} 

    void SetData(T nValue) 
    { 
     Data = nValue; 
    } 

    T GetData() const 
    { 
     return Data; 
    } 

    void PrintData() 
    { 
     cout << Data; 
    } 
}; 

, но при его использовании, вы должны указать тип явно:

Item<int> item1; 

сложной частью является то, что вы не можете Мента заявления в заголовочном файле, и соответствующее осуществление в одном или нескольких исходных файлов (см статью, чтобы увидеть, почему)

шаблоны классов также позволяют несколько аргументов шаблона не типа:.

template<class T, int SIZE> 
class Array 
{ 
static const int Elements_2x = SIZE * 2; 
void DoSomething(int arg = SIZE); 
// Non-const can also appear as default-argument... 
private: 
    T TheArray[SIZE]; 
}; 

Eсть так много других частей и намного больше объяснений, которые я не могу принести здесь.

Я предлагаю вам потратить несколько часов и прочитать эту статью и вторую часть этой статьи. даже если вы считаете, что знаете, как работают шаблоны на C++.

+1

Это теоретически может ответить на вопрос, но было бы лучше включить основные части ответа здесь для будущих пользователей , и предоставить ссылку для справки. [Ответы, связанные с каналом] (// meta.stackexchange.com/questions/8231) могут стать недействительными через [link rot] (// en.wikipedia.org/wiki/Link_rot). – Mogsdad

+1

Это также хорошая идея не отвечать на вопросы, не связанные с темой, например запросы на ресурсы за пределами площадки. – TylerH

Смежные вопросы