Форум программистов, компьютерный форум CyberForum.ru

Объяснить код - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти простые числа и занести их в новый массив http://www.cyberforum.ru/cpp-beginners/thread1542516.html
Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив. Первая функция ищет простые числа и заносит их в новый массив, вторая – все числа кратные трем, третья – все четные числа. В программе создайте массив из 3-х указателей на эти функции. Добавьте меню, в котором пользователь может выбрать желаемую...
C++ Ошибка при определении переменной в switch case 2: // почасовые работники - фиксированная плата за 40ч, после 40ч полуторная ставка int workingNorm = 40; int hours; rate = 1.5; // ставка за сверхурочные часы cout << "Enter the salary for hour: "; cin >> salary; cout << "Enter the number of hours: "; http://www.cyberforum.ru/cpp-beginners/thread1542515.html
Странная инициализация, объясните код C++
Встретил такой код: int x = (3, 2 , 5 , 4 ); std::cout<<x;//4 Вопросы: -как это называться; -зачем; -что происходит в этом случае; Спасибо!
Вывести порядковый номер слова максимальной длины и номер позиции в строке, с которой оно начинается C++
как вывести на экран порядковый номер слова максимальной длины и номер позиции в строке, с которой оно начинается ?
C++ Не выходит открыть второй файл http://www.cyberforum.ru/cpp-beginners/thread1542485.html
Ниже представлена часть программы, все выполняется правильно, но мне необходимо повторить все то же самое с другим файлом и записать данные в другие массивы,естественно пытаясь сделать это путем копирования кода,представленного ниже и замены в нем необходимых переменных вылетает миллион ошибок. cout << "Введите имя файла: "<<endl; cin >> filename; ifstream fin(filename); ...
C++ Класс "Равносторонний треугольник" Создать класс равносторонний треугольник, член класса – длина стороны. Предусмотреть в классе методы вычисления и вывода сведений о фигуре – высота, биссектриса, периметр, площадь. Создать производный класс – тетраэдр, добавить в класс метод определения объема фигуры, перегрузить методы расчета площади и вывода сведений о фигуре. Написать программу, демонстрирующую работу с классом: дано N... подробнее

Показать сообщение отдельно
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,798
Завершенные тесты: 1
02.10.2015, 19:41     Объяснить код
Цитата Сообщение от Operok Посмотреть сообщение
но ругаться на подобное уже будет компилятор, а синтаксический анализатор.
как то не понятно сформулированно.

если что, то все проверки типизации происходят времени компиляции.
так что компилятор в данном случае сам отрабатает,
как статический анализатор.

вот простейший пример:
C++
1
2
3
4
5
6
7
template <class ContainerT>      
void Tokenize(
    const std::string& str,
    ContainerT& tokens,
    const std::string& delimiters = " ",
    bool trimEmpty = false
)
Проблема данного кода заключается в том,
что аргумент const std::string& str не имеет связи с типом контейнера.

допустим, нам нужен юникод.
у нас контейнер:
std::vector<std::wstring>

и соотвественно, парсить мы хотим const std::wstring&
в качестве источника данных

однако шаблон это не учитывает.
в нем жестко прибито гвоздями
const std::string&

все, только если править код руками.

а между тем, любой stl-compatible контейнер имеет паблик-тайпдефы,
чере которые можно было бы вытащить информацию о типе элементов контейнера:

C++
1
2
3
4
5
6
7
8
template <class ContainerT>      
void Tokenize(
    const typename ContainerT::value_type& str,
    ContainerT& tokens,
    const typename ContainerT::value_type& delimiters 
        = Default<typename ContainerT::value_type>(),
    bool trimEmpty = false
)
и все, и никаких проблем.

идем дальше:

если мы запихиваем в какой нибудь std::vector, или std::list
то очевидно, что токены нужно закидывать в конец.
но если это std::set какой нибудь, значит порядок закидывания токенов нам не важен.

проблема в том, что у std::set нету методов аля emplace_back

для std::map ещё сложнее - здесь не понятно, что есть ключ, и что значение.
однако это так же легко разруливается в компалтайме за счет стратегии.

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

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

смысл идеи в том, что бы один раз написать шаблон,
и больше его не трогать.

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

Добавлено через 5 минут
Цитата Сообщение от Operok Посмотреть сообщение
все эти контейнеры подходят под шаблонный тип "<template <typename = std::string, typename = std::allicator<std::string>> class ContainerT>".
зачем усложнять?
обычное T и все прекрасно работает.
 
Текущее время: 09:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru