c++ - 使用模板分配器和对对向量进行排序的函数
问题描述
这是我拥有的功能,它按对的第一个元素对对的向量进行排序。
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 提示,我将不胜感激。喜欢要求。
解决方案
你应该使用什么来表达你的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
参数中推断出来,因此您不需要默认类型。
推荐阅读
- c - 在现代 Windows 命令行上启用 ANSI 转义码处理?[C]
- powershell - Powershell 尝试重新启动打印后台处理程序
- linux - 如何将输入从一个 docker 容器回显到另一个
- uwp - UWP 安装 MVVM Light 和 NuGet
- javascript - 为什么不和谐机器人可以使用默认表情符号,而当我放置自定义表情符号时不起作用?
- javascript - 如何检查“深层”结构是否未定义?
- docker - 从 docker 容器中访问代理的本地 webapp
- bash - Rundeck 不同的输出运行脚本
- python - 在回调函数中使用keyboard.record()
- javascript - .NET Core 5.0 到 Javascript DFH 密钥交换不起作用