1

このコードがあります:

template<typename T, template<typename, typename> class OuterCont, template<typename, typename> class InnerCont, class Alloc=std::allocator<T>>
class ContProxy { 
    OuterCont<T, InnerCont<T, Alloc>> _container;
};
typedef ContProxy<int, std::vector, std::list> IntCont;

ただし、場合によってはasT*の代わりに使用する必要があります- 次のように:std::list<T>InnerCont

template<typename T, template<typename, typename> class OuterCont, T*, class Alloc=std::allocator<T>>
class ContProxy { 
    OuterCont<T, T*> _container;
};

この場合、「テンプレート テンプレート」パラメーターの部分的な特殊化を使用することは可能ですか?
または、頭痛を最小限に抑えてアーカイブする方法..

4

3 に答える 3

3

多くの場合、タイプを単純にテンプレート化する方が簡単です。テンプレートテンプレートを使用してすべての状況を実際にキャプチャすることはできません。誰かが6つのテンプレートパラメータを持つコンテナを使用したい場合はどうでしょうか。したがって、次のようなものを試してください。

template <typename T, typename C>
struct ContProxy
{
    typedef C                    container_type;
    typedef typename C::second_type second_type;

    container_type container_;
};

ContProxy<int, MyContainer<int, std::list<int>> p;
于 2012-05-10T05:34:16.097 に答える
0

私もkerrekの解決策を採用しましたが、それ以外で思いついたのはこれでした。

問題は、InnerContがベーステンプレートでテンプレートタイプとして宣言されているため、生のポインタに特化できないことです。したがって、ポインタを表すダミーのテンプレートを作成して使用することができます。

template<typename,typename> class PtrInnerCont; //just a dummy template that does nothing

template<typename T, template<typename, typename> class OuterCont, template<typename, typename> class InnerCont, class Alloc=std::allocator<T>>
class ContProxy  { 
    OuterCont<T, PtrInnerCont<T, Alloc>> _container;
};
typedef ContProxy<int, std::vector, std::list> IntCont;

template<typename T, template<typename, typename> class OuterCont, class Alloc>
class ContProxy<T, OuterCont, PtrInnerCont, Alloc> { 
    OuterCont<T, T*> _container;
};

typedef ContProxy<int, std::vector, PtrInnerCont> MyCont;
于 2012-05-10T05:45:51.833 に答える
0

すでに実際に行っていることを実際に行うことはできません。標準的な方法ではありません。C++ コンテナーは、同じテンプレート パラメーターを使用しません。

次のようにします。

template< typename T, 
          template<typename, typename> class OuterCont,
          template<typename, typename> class InnerCont, 
          class Alloc=std::allocator<T>>
class ContProxy { 
    typename OuterCont<T, typename InnerCont<T, Alloc>::type>::type _container;
};

次に、次のようにさまざまなコンテナー ジェネレーターを作成できます。

template < typename T, typename A = std::allocator<T> >
struct vector_gen { typedef std::vector<T,A> type; };

またはあなたのポインター1:

template < typename T, typename Ignored >
struct pointer_gen { typedef T* type; };
于 2012-05-10T06:08:14.913 に答える