首页 > 解决方案 > 使用模板分配器和对对向量进行排序的函数

问题描述

这是我拥有的功能,它按对的第一个元素对对的向量进行排序。

std::vector<std::pair<int,std::string>>
sort_pairs(std::vector<std::pair<int,std::string>>&& items)
{
    std::sort(std::begin(items),std::end(items));
    return items;
}

但是,当我尝试将其概括为接受任何类型的分配器和任何类型的分配器时,我得到了一堆错误(太多,无法将它们粘贴到这里)。我使用右值引用作为参数,因为该函数是在其他函数内部调用的,复制参数也可以,但我认为它的效率会降低。这是我尝试过的一些方法。

template <typename Allocator,
          typename P1 = typename Allocator::value_type::first_type,
          typename P2 = typename Allocator::value_type::second_type>
Allocator<std::pair<P1,P2>> sort_pairs(Allocator<std::pair<P1,P2>>&& items)
{
    std::sort(std::begin(items),std::end(items));
    return items;
}

如果您在代码中添加一些 c++20 提示,我将不胜感激。喜欢要求。

标签: c++templatesc++20

解决方案


你应该使用什么来表达你的Allocator,是一个“模板模板参数”。

如下

template <template <typename...> class Allocator,
          typename P1, typename P2>
Allocator<std::pair<P1, P2>>
   sort_pairs (Allocator<std::pair<P1, P2>> && items)
 {
   std::sort(std::begin(items),std::end(items));
   return items;
 }

从 C++17 开始,您可以使用typename而不是class定义它

// ..............................VVVVVVVV                                     
template <template <typename...> typename Allocator,

class仍然有效,恕我直言,更可取。

观察那个Allocator拦截std::vector(模板类,而不是特定的特化 as std::vector<std::pair<int, std::string>>),所以你不能像你的例子那样从中提取P1和提取P2

// ....................VVVVVVVVV  not usable this way                       
typename P1 = typename Allocator::value_type::first_type

你应该写

typename Allocator<std::pair<P1, P2>>::value_type::first_type

但是,很明显,你不能用它来给一个默认类型,P1因为你必须知道P1.

幸运的是,P1并且P2可以从items参数中推断出来,因此您不需要默认类型。


推荐阅读