2

重複の可能性:
C++ の述語とは?

C++ 入門書を読むと、 predicateという用語が定義されています。

定義は次のとおりです。

bool に変換できる型を返す関数。一般的なアルゴリズムで要素をテストするためによく使用されます。ライブラリで使用される述語は、単項 (引数を 1 つ取る) またはバイナリ (引数を 2 つ取る) のいずれかです。

bool に変換できる型を返す人は誰でも predicate になれます! 右?または、その他の制限条件があります。

ありがとう!

4

1 に答える 1

3

C ++のコンテキスト(とにかく私が知っている)での述語の正式な定義はありませんが、それは通常、真/偽のコンテキストで使用できる関数を意味します。

これは、 cppreferenceからのcount_ifの可能な実装であり、それが何について話しているかを示しています。

template<class InputIt, class UnaryPredicate>
typename iterator_traits<InputIt>::difference_type
    count_if(InputIt first, InputIt last, UnaryPredicate p)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (p(*first)) {
            ret++;
        }
    }
    return ret;
}

pステートメント内で使用できるものを返す必要がありますif。これは基本的には要約されたものです。

例えば:

class T {};

T f(int x)
{
    return T();
}

Tは暗黙的にboolに変換できないため、これはcount_ifの有効な述語ではありません。

言い換えると:

if (f(4)) { }

コンパイルできないコードです。

ただし、Tを暗黙的にboolに変換できる場合はf、許容できる述語になります(非常に奇妙ですが)。

于 2012-11-27T02:05:35.783 に答える