タイトルが不適切である場合は、自由に書き換えてください。私は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'を2回目のオーバーロードで実行します。 –
@Kerreck SB、-1は間違いでした。完全にテストしていませんでした。論理よりもコンパイルの問題を見ていました。 – Jagannath
あなたのインデックスに 'std :: size_t'を使うことを検討してください。 – pmr