7

C++ の概念 (今後の機能) の代わりとして何を使用しますか?

C++ の概念について聞いたことがあるかもしれません。テンプレートで型の要件を指定できるようにする機能です。

私は今、これを行う方法を探しています。私が見つけた最良の方法は、次のように static_assert と一緒に述語を使用する Stroustrup の本にあります。

template<typename Iter, typename Val>
Iter find(Iter b, Iter e, Val x) 
{
    static_assert(Input_iterator<Iter>(),"find(): Iter is not a Forward iterator");

    // Rest of code...
}

他の方法を使用している場合、またはこの方法に問題がある場合はお知らせください。

4

3 に答える 3

1

概念を確認する最善の方法は、置換失敗を使用することです。ただし、C++98 では、置換エラーを使用した検出はかなり制限されています。C++11 では、より強力な式で置換失敗を使用できます。C++11のTickライブラリは、概念の述語を定義する簡単な方法を提供します。たとえば、クイック アンド ダーティは次のis_input_iteratorように記述できます。

TICK_TRAIT(is_input_iterator,
    std::is_copy_constructible<_>)
{
    template<class I>
    auto requires_(I&& i) -> TICK_VALID(
        *i,
        ++i,
        i++,
        *i++
    );
};

そして、TickTICK_REQUIRESはテンプレートの制約を追加するためのマクロも提供します (これはすべてのenable_ifボイラープレートを処理するだけです)。そのため、次のように関数を定義するだけです:

template<typename Iter, typename Val, TICK_REQUIRES(is_input_iterator<Iter>())>
Iter find(Iter b, Iter e, Val x) 
{
    // Rest of code...
}

static_assert理想的には、コンパイル エラーが発生するため、使用しないでください。そのため、sayfindが特定のパラメーターで呼び出されたときに有効かどうかを検出することはできません。無効な場合はコンパイラ エラーが発生するためです。

于 2014-07-01T22:16:00.437 に答える
1

まあ、コンセプトのような機能が必要になったことが何度かありましたが、Boost Concept Checkに目を向けました。これは最も美しいライブラリではありませんが、すでに多くの機能が組み込まれているようです。

あなたのメソッドを使用する唯一の問題は、すべての特性クラスを記述する必要があることです。私はそれを広範囲に使用したわけではありませんが、おそらく多くの一般的なことが Boost で既に行われています。

于 2014-02-12T16:28:36.423 に答える