首先,它会是std::vector
,没有别的,因为vector
位于std
命名空间,并且您要求一个模板 模板参数, while std::vector<int>
不再是模板了。接下来,一个std::vector
实际上需要two模板参数,一个用于类型,另一个用于分配器:
template <
typename T,
template<typename, typename> class ContainerType,
typename Alloc = std::allocator<T>
>
class Stack{
ContainerType<T, Alloc> container;
// ...
};
// usage:
Stack<int, std::vector> s;
现在,这仅允许具有两个模板参数的容器作为基础类型,因此您最好采用标准的做法:将其视为普通类型:
template <typename T, typename ContainerType>
class Stack{
ContainerType container;
// ...
};
// usage:
Stack<int, std::vector<int> > s;
确保底层类型具有相同的T
,你可以做一个假的“静态断言”,或者如果你有一个启用了 C++0x 的编译器,你可以做一个实际的静态断言:
#include <tr1/type_traits> // C++03 us std::tr1::is_same
//#include <type_traits> // C++0x, use std::is_same
template <typename T, typename ContainerType>
class Stack{
typedef typename ContainerType::value_type underlying_value_type;
typedef char ERROR_different_value_type[
std::tr1::is_same<T, underlying_value_type>::value ? 1 : -1
]
ContainerType container;
// ...
};
这是有效的,因为如果T
与使用过的容器不同T
,这将是一个typedef char ERROR_different_vale_type[-1]
,并且负大小的数组不可能存在,这会导致编译器错误。 :) 现在,使用 C++0x 你可以static_assert
that:
#include <tr1/type_traits> // C++03
//#include <type_traits> // C++0x
template <typename T, typename ContainerType>
class Stack{
typedef typename ContainerType::value_type underlying_value_type;
static_assert(std::tr1::is_same<T, underlying_value_type>::value,
"Error: The type of the stack must be the same as the type of the container");
ContainerType container;
// ...
};
为了方便起见,您现在可以为常见情况指定默认模板参数:
template <typename T, typename ContainerType = std::vector<T>>
class Stack{
ContainerType container;
// ...
};
// usage:
Stack<int> s;
此时你可以使用std::stack
它正是这样做的(尽管它使用std::deque
作为基础类型)。 :)