1
template <class ContainerType, class elementType>
void SerializeContainer (    ContainerType< elementType > container )
{
}

//call like this 
std::vector<int>  vector;
SerializeContainer(vector);

以下はコンパイルされません..これを乗り越える方法はありますか?

4

1 に答える 1

5

value_typeコンテナのメンバーを使用して要素タイプを抽出する方が簡単です。

  template <typename T>
  void SerializeContainer (const T& container)
  {
      typedef typename T::value_type ElementType;
      ..........
  }

コードが機能しない理由は、構文が実際にテンプレートであるContainerType<ElementType>場合にのみ機能するためです。ContainerTypeC++ は、このための template-template パラメーターをサポートしています。

template <template <typename> class ContainerType, typename ElementType>
void serializeContainer(const ContainerType<ElementType>& container) {
}

しかし、これでも標準の C++ コンテナーには一致しません。これ は、いくつかの非表示の既定の引数があるためです。明示的に記述した場合:

std::vector<int, 
            std::allocate<int> >   vector;

そのため、2 つの引数を受け入れるように ContainerType パラメーターを作成する必要があります。

template <typename <typename, typename> C, typename E, typename A>
void serializeContainer(const C<E, A>& container) {
}

set::setただし、テンプレート パラメーターの数が異なるため、これは一致しません。

std::set<int, 
         std::less<int>, 
         std::allocator<int> >  set;

マッチング時に ElementType のスペルを明示的に指定する必要がある場合、(C++11 より前の) 万能のソリューションはありません。コンテナーによって提供される特性に固執することをお勧めします。

于 2012-10-30T19:12:55.370 に答える