以下是我的代码的简化版本:
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
}
这只是一个简化的例子。我的代码中包含两个函数相同的地方,除了<
或>
符号或者应该使用++
还是--
。
我的问题是:
是否有一种方法可以在没有
的情况下减少代码中的重复我在考虑使用指向运算符的指针(<
或>
)作为模板参数。这不应该降低性能,因为指针将是编译时常量。是否有一些更好或通常使用的方式?
编辑:
所以我根据答案做的是实施:
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>());
我希望这就是你的意思。我想,在为++
和--
运营商做一些挣扎的类似解决方案之后。
答案 0 :(得分:5)
我会创建一个带谓词的通用函数,并使用std::greater
和std::less
作为该函数的参数,以便给定类型分别实现findMaximalPosition
和findMinimalPosition
。
答案 1 :(得分:1)
由于Ivaylo Strandjev的消化,一种可能的解决方案是使用谓词。
因此,如果您将函数更改为使用谓词...
typename std::vector<int> vec;
template<typename TIterator, bool (*Predicate)(const TIterator &, const TIterator &)>
TIterator findPosition(TIterator begin, TIterator end)
{
TIterator result(begin);
for (TIterator it = begin + 1; it != end; ++it)
{
if (Predicate(it, result))
result = it;
}
return result;
}
...然后,您定义了一些可以帮助您实现目标的谓词......
bool lesser(const vec::iterator &a, const vec::iterator &b)
{
return (*a) < (*b);
}
bool greater(const vec::iterator &a, const vec::iterator &b)
{
return (*a) > (*b);
}
...那么你就能做到这一点:
vec::iterator min = findPosition<typename vec::iterator, lesser>(v.begin(), v.end());
vec::iterator max = findPosition<typename vec::iterator, greater>(v.begin(), v.end());
优点是提供您认为有用的任何功能,而不仅仅是检查元素是否大于或小于其他功能的功能:
bool weird(const vec::iterator &a, const vec::iterator &b)
{
return ((*a) | (*b)) & 0x4;
}
vec::iterator weird = findPosition<typename vec::iterator, weird>(v.begin(), v.end());
示例here。
但在做这项工作之前,请检查Algorithms library是否已经完成了这项工作。
我觉得它看起来很简洁。
希望它有所帮助。