【问题标题】:Template in a Template -- accessing contained type from a template type模板中的模板——从模板类型访问包含的类型
【发布时间】:2010-10-29 21:52:53
【问题描述】:

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

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 本身必须是一个模板类,其模板参数指定它包含的类型,但这并不是什么大问题。

这可能吗?似乎应该如此。这个叫什么?

【问题讨论】:

    标签: c++ templates stl


    【解决方案1】:

    所有容器都有一个 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.
    }
    

    【讨论】:

    • 最好在主模板中定义一个使用T::value_type 的container_traits&lt;T&gt; 结构,并专门用于内置数组。
    • @Peter:数组不是容器(其中“容器”的意思是“遵守 STL 或标准库容器概念”)。不过,指向数组的指针可以用作迭代器。最好使用迭代器。
    • 谢谢!我想从现在开始我应该在每个容器中包含一个 value_type 的 typedef,对吧?
    • @Alexander:是的;实际上有一个 STL 规范 (sgi.com/tech/stl/Container.html),它定义了接口容器必须实现以及不同类型迭代器的语义是什么。 (据我所知,我链接到的 SGI STL 规范与实际的 C++ 规范非常接近,可以使用它来实现您自己的容器等)。
    【解决方案2】:

    如果T 是适当的 STL 容器,您可以通过以下方式获取值类型:

    typename T::value_type

    例如,如果T 是std::vector&lt;std::string&gt;,那么typename T::value_type 是std::string。

    【讨论】:

      【解决方案3】:

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

      你的模板函数应该是这样的:

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

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 2018-02-21
        • 2022-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2018-01-29
        相关资源
        最近更新 更多