如果標題不合適,請隨意修改標題。我試圖在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