2

わかりましたので、stl のようなアルゴリズムを書きましたcartesian_product。ご存じない方のために説明すると、デカルト積は 2 つのセットから可能なすべての要素のペアです。{1, 2, 3}したがって、とのデカルト積{10, 20, 30}

{(1,10), (1,20), (1,30), (2,10), (2,20), (2,30), (3,10), (3,20), (3,30)}

したがって、関数は次のようになります

template <typename InIt1, typename InIt2, typename OutIt>
void
cartesian_product(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt out)
{
    for (; first1 != last1; ++first1)
        for (InIt2 it = first2; it != last2; ++it)
            *out++ = std::make_pair(*first1, *it);
}

テンプレートの typedef がないため、出力反復子の元になる型を保持するための特性クラスを作成しました。

template <typename ObjA, typename ObjB, template <typename> class Container>
struct cartesian_product_traits
{
    typedef Container<std::pair<ObjA, ObjB> > type;
};

だから私は言うことができます:

typedef cartesian_product_traits<int, int, std::vector>::type IntPairList;
IntPairList my_list;
cartesian_product(v1.begin(), v1.end(), 
                  v2.begin(), v2.end(),
                  std::back_inserter(my_list);

しかし、これはコンパイルされていないようです。私は素晴らしいエラーを受け取ります:

error C3201: the template parameter list for class template 'std::vector' does not match the template parameter list for template parameter 'Container'

だから私は困惑しています。これを機能させるにはどうすればよいですか?

4

2 に答える 2

8

vector のテンプレート パラメーター リストは 1 つの要素だけではなく、2 つ必要です。

template < class T, class Allocator = allocator<T> > class vector

したがって、ベクトルを受け入れるには、2 つの空白を含むテンプレート テンプレート パラメータが必要です。

template <typename ObjA, typename ObjB, template <typename, typename> class Container>
struct cartesian_product_traits

編集済み:アドバイスをカットし、コードを読み間違えました。

これを適切に行う方法は、テンプレート テンプレート パラメータで可変引数マクロを使用することです。

template <typename ObjA, typename ObjB, template <typename ...> class Container>
struct cartesian_product_traits

しかし、それは標準とはかけ離れています。それが私のコードであれば、おそらく消費者に完全なテンプレートを叩きつけてもらうでしょう:

std::vector< std::pair<int, int> >

より短い

cartesian_product_traits<int, int, vector>

後者は、デカルト積の定義が変更された場合にのみ役立ちます。

于 2009-06-11T05:28:35.557 に答える
2

std::vectorのテンプレートは実際には非常に複雑です (アロケーター &c のオプションのテンプレート パラメーターを使用)。また、stdlib 内の他のコンテナーもそれほど単純ではありません。あなたの立場で言えば、私は の 3 番目のパラメーターをcartesian_product_traitsプレーンtypename PairsContainerにし、ペアの適切なコンテナーとしてそれを渡すという小さな問題に取り組むことを呼び出し元に依存します。

于 2009-06-11T05:28:43.590 に答える