【发布时间】:2017-06-18 11:36:42
【问题描述】:
在查看 std::swap 的文档时,我看到了很多专业化。
看起来每个 STL 容器以及许多其他标准设施都有专门的交换。
我想有了模板的帮助,我们就不需要所有这些专业了?
例如,
如果我自己编写pair,它可以与模板版本一起正常工作:
template<class T1,class T2>
struct my_pair{
T1 t1;
T2 t2;
};
int main() {
my_pair<int,char> x{1,'a'};
my_pair<int,char> y{2,'b'};
std::swap(x,y);
}
那么专攻std::pair有什么收获呢?
template< class T1, class T2 >
void swap( pair<T1,T2>& lhs, pair<T1,T2>& rhs );
我还想知道是否应该为自定义类编写自己的专业,
或者只是依赖模板版本。
【问题讨论】:
-
在容器上实现的
swap()方法可以利用容器内部结构,因此更高效(例如std::list只是交换指针和大小)。当您不知道容器类型时,std::swap可以在模板中使用。std::swap的特化可以调用容器方法来利用更有效的实现 -
我怀疑在移动语义之前差异要大得多。在此之前,对容器内部的访问仅意味着切换指针,而通用路由(没有特殊的编译器支持)可能需要进行大量复制。
-
它们是重载,而不是模板特化。
-
交换一对可能会很痛苦。你需要做的第一件事就是把该死的鹧鸪从树上弄下来......
-
大多数时候我发现自己写了一个
swap重载,我这样做是因为我想利用“copy & swap” idiom。
标签: c++ templates stl swap template-specialization