Overloading global swap for user-defined type(重载用户定义类型的全局交换)
问题描述
C++ 标准禁止在名称空间 std
中声明类型或定义任何内容,但它允许您为用户定义的类型专门化标准 STL 模板.
The C++ standard prohibits declaring types or defining anything in namespace std
, but it does allow you to specialize standard STL templates for user-defined types.
通常,当我想为我自己的自定义模板类型专门化 std::swap
时,我只是这样做:
Usually, when I want to specialize std::swap
for my own custom templated type, I just do:
namespace std
{
template <class T>
void swap(MyType<T>& t1, MyType<T>& t2)
{
t1.swap(t2);
}
}
...而且效果很好.但我不完全确定我的通常做法是否符合标准.我这样做正确吗?
...and that works out fine. But I'm not entirely sure if my usual practice is standard compliant. Am I doing this correctly?
推荐答案
你所拥有的不是专业化,它是重载,正是标准所禁止的.(但是,它目前在实践中几乎总是有效,并且您可能可以接受.)
What you have is not a specialization, it is overloading and exactly what the standard prohibits. (However, it will almost always currently work in practice, and may be acceptable to you.)
以下是您为类模板提供自己的交换的方法:
Here is how you provide your own swap for your class template:
template<class T>
struct Ex {
friend void swap(Ex& a, Ex& b) {
using std::swap;
swap(a.n, b.n);
}
T n;
}
这里是你如何调用 swap,你会注意到 Ex 的 swap 中也使用了它:
And here is how you call swap, which you'll notice is used in Ex's swap too:
void f() {
using std::swap; // std::swap is the default or fallback
Ex<int> a, b;
swap(a, b); // invokes ADL
}
相关:函数模板专业化重要性和必要性
这篇关于重载用户定义类型的全局交换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:重载用户定义类型的全局交换
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01