template <class ContainerType, class elementType>
void SerializeContainer ( ContainerType< elementType > container )
{
}
//call like this
std::vector<int> vector;
SerializeContainer(vector);
以下はコンパイルされません..これを乗り越える方法はありますか?
value_type
コンテナのメンバーを使用して要素タイプを抽出する方が簡単です。
template <typename T>
void SerializeContainer (const T& container)
{
typedef typename T::value_type ElementType;
..........
}
コードが機能しない理由は、構文が実際にテンプレートであるContainerType<ElementType>
場合にのみ機能するためです。ContainerType
C++ は、このための 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 より前の) 万能のソリューションはありません。コンテナーによって提供される特性に固執することをお勧めします。