模板中的模板 - 从模板类型访问包含的类型

时间:2010-10-29 21:52:54

标签: c++ templates stl

我试图写一个模板化的快速排序功能。我的想法是,我会编写一个快速排序,可以对任何数据结构进行操作,该结构具有下标操作符和包含在其中的对象的顺序关系,所以我可以做类似的事情

quicksort<deque<int> >();
quicksort<vector<string> >(); 

我开始使用类似

的功能
template<typename T>
void quicksort(T& list);

我遇到的问题是提出了一个执行排序操作的函数。我需要知道我交换的值是字符串,字符,整数,还是什么,所以我可以暂时执行交换!

所以我需要能够做这样的事情(我知道这种语法不正确,我只是想说明我正在尝试做什么):

template<typename T, typename R>
void quicksort(T<R>& list);

所以当我执行交换时,我可以知道T中包含什么类型的对象。显然,这意味着T本身必须是一个模板类,模板参数指定它包含的类型,但这并不是什么大不了的事。

这可能吗?看起来应该是这样。这个叫什么?

3 个答案:

答案 0 :(得分:3)

所有容器都有一个typedef value_type,可用于获取T

template <typename ContainerT>
void quicksort(ContainerT& container)
{
    typedef typename ContainerT::value_type ElementT;
    // etc.
}

尽管如此,应尽可能使用迭代器实现算法,以进一步将它们与特定的容器实现分离。例如,

template <typename RandomAccessItT>
void quicksort(RandomAccessItT first, RandomAccessItT last)
{
    typedef std::iterator_traits<RandomAccessItT>::value_type ElementT;
    // etc.
}

答案 1 :(得分:2)

如果T是正确的STL容器,则可以使用以下命令获取值类型:

typename T::value_type

因此,例如,如果Tstd::vector<std::string>,那么typename T::value_type就是std::string

答案 2 :(得分:1)

您可以使用std :: swap交换两个值。

您的模板功能应如下所示:

template < class ContainterType >
void quicksort( ContainerType &container )
{
 //  ...
}