В моем коде у меня часто есть функции, выполняющие одно и то же на разных итерируемых типах Qt Container, например:
void removeX(QMap<qint64, QString> & map)
{
QMutableMapIterator<qint64, QString> it(map);
while (it.hasNext()) {
it.next();
if (it.value() == "X") it.remove();
}
}
void removeX(QList<QString> & list)
{
QMutableListIterator<QString> it(list);
while (it.hasNext()) {
it.next();
if (it.value() == "X") it.remove();
}
}
(и я знаю, что в QList уже есть функция removeAll
. Это просто глупый минимальный пример)
Фактический код является более сложным, и, следовательно, в нем много дублирования кода. Я бы предпочел иметь что-то вроде:
template <typename T>
void removeX_(T & container)
{
typename T::mutable_iterator it(container);
while (it.hasNext()) {
it.next();
if (it.value() == "X") it.remove();
}
}
Конечно, это не компилируется, так как в Qt просто нет определения типа ":: mutable_iterator". Можно ли построить один? Я не вижу простой способ сделать это. Такая функция, как «template <...> getMyMutableIterator», не может работать в этом случае, поскольку нам не разрешено возвращать различные типы для перегруженной функции.
Но есть много новой "магии шаблонов" из C ++ 17, которую я до сих пор не понял. Я мог представить, что это может быть простой способ реализовать приведенный выше код. У кого-нибудь есть решение, чтобы уменьшить дублирование кода здесь?