0

私はこのコードを理解しようとしています

    template <typename T, typename _Prd = equal_to<T> >
    struct Vector3
    {
    protected:
        T i,j,k;
        _Prd comp;
    public:
        //default constructor
        Vector3(void);

        //explicit constructor
        Vector3(const T& ijk);

        //explicit constructor
        Vector3(const T& i,const T& j,const T& k);

        //copy constructor
        Vector3(const Vector3<T,_Prd>& copy_from);

        //getters
        T I() const;
        T J() const;
        T K() const;

        //setters
        void I(const T& i);
        void J(const T& j);
        void K(const T& k);

        //get magnitude of vector.
        T Magnitude() const;

        //angle between I,J (clockwise)
        T Direction() const;

        //angle between K and I,J
        T Elevation() const;

        //scale vector to 1
        Vector3<T,_Prd>& Normalize();

        //vector scale up-to value
        Vector3<T,_Prd>& Scale(const T& length);

        ...
};

最初の声明が理解できない

template <typename T, typename _Prd = equal_to<T> > struct Vector3 {};

それはの使用法についてです、私はここここequal_to<T>から参照を見つけました。しかし、それでもこのようなものはありません。この部分を理解するために助けてくれてありがとう。

アップデート:

答えを見て教科書を読んだ後、私の質問は2つの側面に変わります。

1.デフォルトのテンプレート引数

C ++ 11では、デフォルトのテンプレート引数をテンプレートに提供できます。C++プライマー第5版の例。ページ670。

#include <functional>
template <typename T, typename F = less<T> >
int compare (const T &v1, const T &v2, F f = F() )
{
    if (f(v1, v2) return -1 ;
    if (f(v2, v1) return 1 ;
    return 0 ;
}

そして、このテンプレートを次のように使用します。

bool i = compare(0,42) ; 

テンプレートは、デフォルトのlessfunction-objectクラスを使用してインスタンス化します。ただし、独自のオブジェクトを使用する場合:

Sales_data item(cin), item2(cin) ;
bool j = compare (item, item2, compareIsbn) ;

次に、Fは代わりにcompareIsbn関数オブジェクトに変わります。上記の私の質問でも同じことが起こるように、この方法では、テンプレートのユーザーに入り口を残して、独自の関数オブジェクトを導入できるようにします。この場合は、コンパレータとして使用されます。

2.述語

C ++の述語とは何ですか

4

2 に答える 2

2

std::equal_toはクラステンプレートであり、次のようなものを提供します。

bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }

つまり、通常の==コンパレータをラップする関数オブジェクトクラスです。重要なのは、equal_to専門化できるため、カスタマイズ性を追加するための邪魔にならない方法を提供することです。

さらに、テンプレートは、2番目のテンプレート引数を使用してコンパレータをカスタマイズするための煩わしい方法Vector3も提供します。

述語は通常、トレイトクラスだけでなく、オブジェクトであることに注意してください。したがって、コンテナには実際には述語サブオブジェクトが含まれます。述語クラスがデフォルトで構築可能である場合、これは問題ありませんが、そうでない場合は、通常、コンテナーコンストラクターで述語のコピーを提供する必要があります。

宿題として、述語サブオブジェクトに実際のメモリを費やさないようにする方法を考えることができます。

于 2012-11-06T01:13:25.117 に答える
1

The second template argument _Prd is assigned a default type much like a function can have default values for arguments. STL uses this heavily. have a look at std::basic_string as an example

于 2012-11-06T01:13:35.197 に答える