如何为我的模板类添加 std::swap ?

发布于 2024-11-16 13:25:45 字数 568 浏览 3 评论 0原文

可能的重复:
如何为我的类提供交换函数?

对此有一些问题,但有很多矛盾(A 给出了解决方案 A',得到了很多赞成票,而 B 说它是 UB)或“只有在编译器支持 ADL 时才有效”得到了回答。

所以,假设我有以下模板(容器)类:

template<typename T>
class C {
    // ...
    void swap(C<T>& y) throw(); // C x; x.swap(y);
}

那么确保此(示例)代码有效的正确方法是什么:

C<int> x, y;
std::swap(x, y);

请给出 C++03 的答案,如果它在 C++0x 中仍然有效,甚至更好!

Possible Duplicate:
how to provide a swap function for my class?

There are some questions about this, but a lot of contradictions (person A giving solution A' with many upvotes with person B saying it's UB) or "only works if the compiler supports ADL" is answered.

So, say I have the following template (container) class:

template<typename T>
class C {
    // ...
    void swap(C<T>& y) throw(); // C x; x.swap(y);
}

then what is the correct way to make sure this (example) code works:

C<int> x, y;
std::swap(x, y);

Please give your answer for C++03, and if it still works in C++0x, even better!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叫思念不要吵 2024-11-23 13:25:45

不允许重载 std 命名空间中的函数。

将 swap 声明为自由函数,在与类 C 相同的命名空间中重载:

 template<class T>
 void swap(C<T>& x, C<T>& y) { x.swap(y); }

正确的交换方法是导入 std::swap 并使用非限定版本(通过基于命名空间的 Koenig 查找检索):

 template<class T>
 void dostuff(T x, T y) {
    ...
    using std::swap;
    swap(x,y);
    ...
 }

如果 x 和 是 C,则将使用 C::swap,对于没有其自身的类型,将使用 std::swap自己的交换。

(像上面这样的 std::swap 的导入仅在类型未知的模板函数中是必要的。如果你知道你有一个 C,那么你可以立即使用 x.swap(y) ,不会有问题.)

You are not allowed to overload functions in the std-namespace.

Declare swap as a free function, overloaded in the same namespace as your class C:

 template<class T>
 void swap(C<T>& x, C<T>& y) { x.swap(y); }

The right way to swap is to import std::swap and use a non-qualified version (which is retreieved via namespace-based Koenig lookup):

 template<class T>
 void dostuff(T x, T y) {
    ...
    using std::swap;
    swap(x,y);
    ...
 }

That will use C::swap if x and are C, and std::swap for types that do not have their own swap.

(The import of std::swap like above is only necessary in template functions where the type is not known. If you know you have a C, then you can use x.swap(y) right away w/o problems.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文