1126] Должен признать, что template
все еще кажутся мне чёрной магией. Я успешно использовал специализации шаблона в различных ситуациях (если у меня не было лучшей идеи), но никогда не использовал аргументы шаблона. Итак, я попытался ...
Когда я попробовал coliru (компилятор g++ (GCC) 8.1.0
), я начал с -std=c++11
и вскоре получил несколько ужасных ошибок. К счастью, был также совет перейти к -std=c++17
. Я сделал, и вещи становятся намного лучше сразу. Я грубо вспомнил, что аргументы шаблона не очень хорошо поддерживаются в C ++ 11. Короткий взгляд на cppreference
подтвердил мою правоту:
template < список параметров> имя типа (C ++ 17) | имя класса (необязательно) (1)
шаблон < список параметров> имя типа (C ++ 17) | имя класса (необязательно) = default (2)
шаблон < список параметров> имя типа (C ++ 17) | class ... name (необязательно) (3) (начиная с C ++ 11)1) Параметр шаблона шаблона с необязательным именем.
blockquote>
2) Параметр шаблона шаблона с необязательным именем и значением по умолчанию.
3) Пакет параметров шаблона шаблона с необязательным именем.После разъяснения я взял часть кода кода OPs и добавил частичную специализацию для
template
, где я
- оставил первый параметр
- специализированный. второй параметр с
std::stack
.На самом деле, это не сильно отличается от того, как специализируются шаблоны с аргументами типа или значения.
cppreference
есть статья для этой частичной специализации шаблона , но при использовании этого термина в качестве ключевого слова для поиска должно быть много обращений к книгам и учебным пособиям. (Я помню книгу, в которой я когда-то учил шаблоны C ++, упомянул об этом также - конечно.)Итак, вот мой небольшой пример, чтобы продемонстрировать это:
#include
#include #include template typename U> class ContainerT { private: U _container; public: ContainerT(): _container() { } ~ContainerT() = default; ContainerT(const ContainerT&) = default; ContainerT& operator=(const ContainerT&) = default; bool empty() const { return _container.empty(); } void push(const T &data) { _container.push_back(data); } T pop() { const T data = _container.back(); _container.pop_back(); return data; } }; template class ContainerT { private: std::stack _container; public: ContainerT(): _container() { } ~ContainerT() = default; ContainerT(const ContainerT&) = default; ContainerT& operator=(const ContainerT&) = default; bool empty() const { return _container.empty(); } void push(const T &data) { _container.push(data); } T pop() { const T data = _container.top(); _container.pop(); return data; } }; #define DEBUG(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__ int main() { // for std::vector DEBUG(ContainerT vec); DEBUG(vec.push(1); vec.push(2); vec.push(3)); DEBUG(while (!vec.empty()) std::cout << vec.pop() << '\n'); // for std::stack DEBUG(ContainerT stk); DEBUG(stk.push(1); stk.push(2); stk.push(3)); DEBUG(while (!stk.empty()) std::cout << stk.pop() << '\n'); // done return 0; } Очевидно, что [1110 ] создан для
ContainerT
. В противном случае методpush()
не может быть скомпилирован.Для
ContainerT
вместо этого используется специализация. (Опять же, в противном случае методpush()
не может быть скомпилирован.)Вывод:
ContainerT
vec; vec.push(1); vec.push(2); vec.push(3); while (!vec.empty()) std::cout << vec.pop() << '\n'; 3 2 1 ContainerT stk; stk.push(1); stk.push(2); stk.push(3); while (!stk.empty()) std::cout << stk.pop() << '\n'; 3 2 1 Live Demo на колиру kbd>
Запустите с 2.x. Большинство существующих библиотек будет идти 2.x в течение долгого времени. В прошлом году сам Guido сказал, что это будут "два года", пока Вы не должны были учиться 3.0; существует все еще другой оставленный год. Лично, я думаю, что это будет длиннее. Написание кода людей на 2.x может изучить, как использовать 2to3
инструмент и имеет код, который работает над обеими версиями. Существует № 3to2, таким образом, код, написанный для python 3, значительно менее ценен.
Это не говоря уже о том, насколько неутешительный это будет для Ваших студентов, чтобы узнать, что python 3 не установлен на их компьютере Linux ("/usr/bin/python
"будет Python 2.x в течение следующих 5 лет, по крайней мере), что нет никакого django для python 3, никакого wxwindows для python 3, никакого GTK для python 3, нет Скрученного для python 3, никакого PIL для python 3... реальная сила Python всегда была в ее обширном наборе библиотек, и существует очень немного библиотек для python 3 прямо сейчас.
Если Ваше учебное руководство правильно написано, необходимо легко смочь обновить его к python 2.6, 2.7, и в конечном счете python 3.
Van Rossum (создатель Python) объясняет, что, "при запуске совершенно новой вещи необходимо использовать 3.0". Таким образом, большинство людей, надеющихся начинать, должно даже ЗАПУСТИТЬ с 3,0. Это будет полезно тем более, что существуют, вероятно, очень немногие там теперь.
Изучите Python 3.0, как заразный предполагает.
Python 2.x не очень отличается, кажется, существует много FUD о довольно незначительных различиях между ними. Несомненно, различия являются достаточно большими, что большинство программ должно будет быть изменено, но почти все модификации просты (как изменение print
оператор к print
функция).
На самом деле Python 2.6 может дополнительно активировать все новые синтаксические опции Python 3.0. Это - очень хорошо продуманный процесс перехода.
Это зависит от Вашей аудитории. Если бы это - широкая аудитория, и Вы планируете оставить отправляемым в течение долгого времени, я предложил бы ожидать и идти с 3,0. С другой стороны, если это для проекта или группы, это будет выполнением работы в ближайшем будущем, Python 2, вероятно, имеют больше смысла.
Различия являются достаточно небольшими, что это действительно не будет иметь значение очень.
Python 2.x отсутствовал достаточно долго уже для создания довольно многих учебных руководств, но 3k имеет намного меньше доступных ресурсов. Некоторый вводный материал уровня 3k, вероятно, видел бы использование более общего назначения. Таким образом, если Вы не адаптируете это в соответствии с определенным sub доменом, который испытывает недостаток в любых ресурсах Python, 3k имел бы большее применение.