Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <type_traits>
- /* примеры реализации стандартных классов типов */
- template<bool Condition, typename T = void>
- struct enable_if {};
- template<typename T>
- struct enable_if<true, T> {
- typedef T type;
- };
- template<typename T> struct is_integral {
- static const bool value = false;
- };
- template<> struct is_integral<int> {
- static const bool value = true;
- };
- // и так далее для всех интегральных типов
- /* общий шаблон для классов-итераторов, унаследованных от std::iterator */
- template<typename Iterator>
- struct iterator_traits {
- typedef typename Iterator::value_type value_type;
- typedef typename Iterator::pointer pointer;
- // и так далее
- };
- /* специализируем для указателей */
- template<typename T>
- struct iterator_traits<T*> {
- typedef T value_type;
- typedef T *pointer;
- // ...
- };
- template<typename T>
- class Array {
- public:
- Array(size_t n, const T& val): data_(n, val) {
- std::cout << "1\n";
- }
- /* sfinae */
- /* правильно конечно использовать список инициализации,
- * напишем так, чтобы явно видеть CE без sfinae */
- template<
- typename Iterator,
- typename = typename std::enable_if<!std::is_integral<Iterator>::value>::type
- >
- Array(Iterator first, Iterator last) {
- while (first != last)
- data_.push_back(*first++);
- std::cout << "2\n";
- }
- private:
- std::vector<T> data_;
- };
- /* еще одно применение шаблонов - используем механизм подстановки
- * чтобы узнать размер массива на этапе компиляции */
- template<typename T, size_t N>
- size_t size(T (&array)[N]) {
- return N;
- }
- template<typename Iterator>
- void print(Iterator first, Iterator last) {
- while (first != last) {
- /* имя типа зависит от параметра шаблона, необходимо typename
- * явно определяем тип с помощью iterator_traits */
- typename iterator_traits<Iterator>::value_type cur_element = *first;
- std::cout << cur_element << " ";
- ++first;
- }
- std::cout << "\n";
- }
- int main() {
- std::vector<int> v{1, 2, 3};
- Array<int> a(5, 3); // CE если не использовать sfinae
- Array<int> b(v.begin(), v.end());
- int c[3] = {2, 3, 4};
- std::cout << size(c) << "\n";
- print(v.begin(), v.end()); // Iterator = std::vector<int>::iterator
- print(c, c + 3); // Iterator = int *
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement