Вот упрощенная версия моего кода:Как элегантно избежать дублирования кода при <изменениях>?
template<typename TIterator>
TIterator findMaximalPosition(TIterator begin, TIterator end)
{
TIterator result(begin);
for (TIterator it = begin + 1; it != end; ++it)
{
if ((*it)->value > (*result)->value) // Here I just need to change to "<"
result = it; // to get a findMinimalPosition
}
return result;
}
template<typename TIterator>
TIterator findMinimalPosition(TIterator begin, TIterator end)
{
// almost the same
}
Это просто упрощенный пример. Мой код полон мест, где две функции одинаковы, за исключением знака <
или >
, или следует использовать ++
или --
.
Мой вопрос:
Есть ли способ, как уменьшить это дублирование в коде без
- Уничтожение читаемость
- Уменьшение производительности?
Я думал об использовании указателя на оператора (либо <
, либо >
) в качестве параметра шаблона. Это не должно уменьшать производительность, поскольку указатель будет постоянной времени компиляции. Есть ли какой-то лучший или обычно используемый способ?
EDIT:
Так что я сделал на основе ответов было реализовать:
template <typename TIterator, typename TComparison>
TIterator findExtremalPosition(TIterator begin, TIterator end,
TComparison comparison);
, а затем просто позвонить:
return findExtremalPosition(begin, end, std::less<double>());
и
return findExtremalPosition(begin, end, std::greater<double>());
I надеюсь, это то, что вы eant. Я полагаю, что после некоторого борющегося аналогичного решения можно сделать для ++
и --
операторов.
См. ['Max_element'] (http://en.cppreference.com/w/cpp/algorithm/max_element). –
Спасибо, проблема в том, что я часто получаю эту ситуацию, и бывают случаи, когда стандартный алгоритм не будет выполнять эту работу. И что вы подразумеваете под «==»? –
@MartinDrozdik: ... еще, см. 'Max_element'. Даже если вы не можете использовать его, у него есть решение проблемы. –