如果标题不合适,请随意修改标题。我试图在STL中找到find和find_if算法的封装。这是我现在所拥有的。如何重载在C++中使用谓词与值的方法
template<typename Type, size_t SIZE>
int IndexOf(const Type(&arr)[SIZE], const Type& val)
{
return IndexOf(arr, arr + SIZE, val);
}
template<typename Iter, typename Type>
int IndexOf(Iter first, Iter last, const Type& val)
{
auto index = find(first, last, val);
if (index != last)
{
return distance(first, index);
}
return -1;
}
template<typename Type, size_t SIZE, typename Pred>
int IndexOf(const Type(&arr)[SIZE], Pred pred)
{
return IndexOf(arr, arr + SIZE, pred);
}
template<typename Iter, typename Pred>
int IndexOf(Iter first, Iter last, Pred pred)
{
auto index = find_if(first, last, pred);
if (index != last)
{
return distance(first, index);
}
return -1;
}
以下用法未能编译出含糊不清的超载。
vector<string> names;
names.push_back("Jagan");
names.push_back("Gagan");
names.push_back("Magan");
names.push_back("Pagan");
names.push_back("Vagan");
std::cout << "Index of (Gagan)" << IndexOf(begin(names), end(names),
[](const string& name)
{
return name == "Gagan";
});
以上示例用法仅供简要说明。
尝试'const的类型名称Iter :: value_type&val'在第二个过载中。 – 2012-02-07 22:25:06
@Kerreck SB,-1是一个错误。没有测试完整。看看编译问题,而不是逻辑。 – Jagannath 2012-02-07 22:39:32
考虑为你的索引使用'std :: size_t'。 – pmr 2012-02-07 23:15:53