Я новичок в C++ Templates, и мне трудно понять и отладить их. Каковы хорошие ресурсы для обоих?Ресурсы для шаблонов C++
ответ
Рекомендую отличную книгу C++ Templates - The Complete Guide от Vandevoorde и Josuttis.
Шаблон - это просто способ уменьшить количество кода, которое необходимо написать при разработке классов.
Например СТЛ вектор
std::vector<int> intList;
std::vector<float> floatList;
Это заставит компилятор на самом деле сделать два класса за кулисами, подобные, если скопировать и вставить код, но заменить все ссылки на Int с поплавком.
Без шаблонов вам понадобится создать векторный класс для каждого типа, который вы хотите обработать. Для классов существует более сложное использование, но это самый простой способ использования, создать &.
После скомпилирования два набора кода для vector<int>
и vector<float>
полностью разделены, но при отладке среда IDE будет проходить через класс шаблона.
Они предназначены для расширения и модификации по мере необходимости. Помните, что это шаблон, а не решение.
НТН
Alexandrescu является мастер шаблонов. У него много рецензий (многие из которых свободно доступны на его веб-сайте и других сайтах) и некоторые книги.
Boost Documentation и Boost Cookbook - хороший сайт для начала, как только вы будете довольны шаблонами и почувствуете, что закончите Boost.
У меня есть два быстрых совета, которые могут сэкономить вам некоторые проблемы в будущем.
Шаблоны должны быть определены и реализованы в заголовках, так как они переводятся/создается во время компиляции
Если у вас есть следующий код:
// 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;
И, как и с обычными декларациями вперед, вы должны убедитесь, что вы включили все необходимые заголовки.
это очень хорошо и почти лаконичная статья, чтобы узнать о 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++.
Это теоретически может ответить на вопрос, но было бы лучше включить основные части ответа здесь для будущих пользователей , и предоставить ссылку для справки. [Ответы, связанные с каналом] (// meta.stackexchange.com/questions/8231) могут стать недействительными через [link rot] (// en.wikipedia.org/wiki/Link_rot). – Mogsdad
Это также хорошая идея не отвечать на вопросы, не связанные с темой, например запросы на ресурсы за пределами площадки. – TylerH
- 1. Ресурсы для шаблонов протоколов
- 2. Ресурсы шаблонов CFML Design?
- 3. хорошие ресурсы для шаблонов grok для файла журнала python
- 4. Где хорошие ресурсы для шаблонов слов для программирования?
- 5. Использование шаблонов для C++
- 6. C++ Уменьшение резервирования шаблонов для шаблонов
- 7. Каковы наилучшие ресурсы для шаблонов проектирования и их использования?
- 8. Подтвердить ресурсы AWS с помощью шаблонов CloudFormation
- 9. Основы шаблонов шаблонов C++
- 10. Ресурсы для обучения детей C#
- 11. Ресурсы C# для разработчика интерфейса
- 12. Ресурсы для тестирования модулей C#
- 13. Ресурсы для I18N в C++
- 14. Ресурсы для изучения «современных» шаблонов веб-архитектуры с использованием python?
- 15. Онлайн-ресурсы для готовых стилей WPF/шаблонов управления?
- 16. Лучшие ресурсы для изучения C/C++
- 17. Ресурсы для кросс-платформенной разработки C/C++
- 18. Математические ресурсы для программистов C/C++
- 19. C++ typedef для частичных шаблонов
- 20. Использование шаблонов C++ для диспетчера ресурсов SFML
- 21. Ресурсы C/C++ для разработки с использованием MetroWerks C/C++
- 22. Ресурсы для обучения шаблонам проектирования
- 23. C# /. Net Ресурсы ActiveDirectory
- 24. C# создавать ресурсы программно
- 25. C++ 11 псевдонимы шаблонов шаблонов против оберток
- 26. Переучивать современные ресурсы C++?
- 27. C# - освободить родные ресурсы
- 28. C# - ресурсы программирования Bluetooth
- 29. C++ многопоточные общие ресурсы
- 30. Каковы ресурсы для создания статического анализатора для C в C?
Они довольно просты. Дайте нам код, который вы не понимаете, мы попытаемся разобраться в этом. – User
Можете ли вы уточнить? Что вам нужно знать о них, и что вы не понимаете? – jalf
Какой материал вы прочитали и не поняли? Там много хороших книг и онлайн-текстов, которые объясняют шаблоны. –