は、我々は次のような状況を持っている想像しない:なぜのstd ::署名copy_if述語の種類を制限しませ
struct A
{
int i;
};
struct B
{
A a;
int other_things;
};
bool predicate(const A& a)
{
return a.i > 123;
}
bool predicate(const B& b)
{
return predicate(b.a);
}
int main()
{
std::vector<A> a_source;
std::vector<B> b_source;
std::vector<A> a_target;
std::vector<B> b_target;
std::copy_if(a_source.begin(), a_source.end(), std::back_inserter(a_target), predicate);
std::copy_if(b_source.begin(), b_source.end(), std::back_inserter(b_target), predicate);
return 0;
}
predicate()
機能の正しい過負荷がinferedすることはできませんのでstd::copy_if
への呼び出しの両方が、コンパイルエラーが発生しますstd::copy_if
テンプレートの署名以来、コンパイラによって述語のいずれかのタイプを受け入れる:私はもっとconstraにstd::copy_if
呼び出しをラップする場合はオーバーロードの解決が機能してい
template<typename _IIter,
typename _OIter,
typename _Predicate>
_OIter copy_if(// etc...
inedテンプレート関数:
template<typename _IIter,
typename _OIter,
typename _Predicate = bool(const typename std::iterator_traits<_IIter>::value_type&) >
void copy_if(_IIter source_begin,
_IIter source_end,
_OIter target,
_Predicate pred)
{
std::copy_if(source_begin, source_end, target, pred);
}
私の質問は次のとおりです:STLでこれがまだこのように制約されていないのはなぜですか?私が見てきたように、_Predicate
型がbool
を返す関数ではなく、反復入力型を受け入れると、とにかくコンパイラエラーが発生します。だから、この制約を署名に入れておかないと、過負荷解決が機能しないのですか?
制約が強すぎます( 'const'は必須ではありません。いくつかの変換が許可されます(' int'から 'bool'))。 'decltype'は正しい要件(またはConcept)を許しますが、そのメソッドはC++ 11より前に行われました。 – Jarod42