10

開発者チームの一員として、公開するカスタムイテレーターに一連の関数(および演算子)が確実に実装されるようにしたかったのです。基本型としてSTLイテレータ型を使用すると役立ちますが、いくつかの理由(私の制御外)のために、STL互換性を強制しないことにしました。イテレータは、同じチームと会社全体の人々によって消費されます。

イテレータタイプを使用し、設計コントラクトに対してテストするテンプレートクラスを設計したかったのです。

たとえば、イテレータがoperator ++、operator--を実装し、必要なtypedefを宣言することを期待します。

1>設計契約を実施するようなテンプレートクラスを実装することは可能ですか?おそらくstatic_assertを使用していますか?

2>はいの場合、これは良いデザインですか?

参照:カスタムイテレータ

4

2 に答える 2

12

設計契約を実施するようなテンプレートクラスを実装することは可能ですか?おそらくstatic_assertを使用していますか?

特定のメソッドが存在するかどうかを確認するには(この例と非常によく似ています):

struct Hello
{
};

struct Generic {
    int operator++()
    {
        return 5;
    }
};


// SFINAE test
template <typename T>
class has_operator_plusplus
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( decltype(&C::operator++) ) ;
    template <typename C> static two test(...);

public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
};


int main(int argc, char *argv[])
{
    // the first check breaks the build
    //static_assert( has_operator_plusplus<Hello>::value, "has no operator" );
    static_assert( has_operator_plusplus<Generic>::value, "has no operator" );
}

これは良いデザインですか?

はい、ビルドを中断することでエラーが非常に速くキャッチされ、クラスのユーザーはドキュメントを読む必要がないためです(ほとんどの人は通常、プログラミング時にその部分をスキップします)

于 2012-09-20T10:19:26.023 に答える
2

はい、そのようなテンプレートクラスを実装できます。SFINAEを使用して、さまざまなメンバーの存在をテストできます。メンバーが正しくない場合は、static_assert。C++11の世界でtypedefを定義したい理由はわかりませんが。

コードに対して追加のチェックを行うことは常に良い考えです。

于 2012-09-20T09:52:56.190 に答える