如何在 C++98 中有效地将 std::queue 的内容传输到另一个?
How to efficiently transfer the contents of an std::queue to another in C++98?
在 C++11 或更高版本中,可以通过 高效地将一个 std:queue
实例的所有内容传输到另一个 std::queue
实例。然而,我正在使用的系统只是 C++98。如何在 C++98 中(高效地)执行相同的操作?
对于 C++98,您需要访问受保护的 c
成员,并交换 那些 容器。交换意味着快速和异常安全(实际上 是 对于标准容器),并且是在添加 std::move
.[=19= 之前使用的惯用语]
您可以通过派生和指向成员的指针来做到这一点。
template<typename E, class C>
void swapQueues(std::queue<E, C>& lhs, std::queue<E, C>& rhs) {
struct peek : std::queue<E, C> {
using std::queue<E, C>::c; // Grant access
};
C std::queue<E, C>::* ptr = &peek::c;
(lhs.*ptr).swap(rhs.*ptr);
}
我们从队列类型中推导出peek
,从而得到一个可以访问c
成员的class类型。然后我们立即在 peek
.
中公开该成员
之后,我们通过public peek::c
获取指向成员的指针。指针到成员的转换在这里是隐式的,允许我们初始化一个指向成员的指针 std::queue
.
最后,应用指向成员的指针来获取对每个队列的底层容器的引用并交换它们是一件简单的事情。
在 C++11 或更高版本中,可以通过 std:queue
实例的所有内容传输到另一个 std::queue
实例。然而,我正在使用的系统只是 C++98。如何在 C++98 中(高效地)执行相同的操作?
对于 C++98,您需要访问受保护的 c
成员,并交换 那些 容器。交换意味着快速和异常安全(实际上 是 对于标准容器),并且是在添加 std::move
.[=19= 之前使用的惯用语]
您可以通过派生和指向成员的指针来做到这一点。
template<typename E, class C>
void swapQueues(std::queue<E, C>& lhs, std::queue<E, C>& rhs) {
struct peek : std::queue<E, C> {
using std::queue<E, C>::c; // Grant access
};
C std::queue<E, C>::* ptr = &peek::c;
(lhs.*ptr).swap(rhs.*ptr);
}
我们从队列类型中推导出peek
,从而得到一个可以访问c
成员的class类型。然后我们立即在 peek
.
之后,我们通过public peek::c
获取指向成员的指针。指针到成员的转换在这里是隐式的,允许我们初始化一个指向成员的指针 std::queue
.
最后,应用指向成员的指针来获取对每个队列的底层容器的引用并交换它们是一件简单的事情。