std::swap 不调用我的自定义交换实现 c++11
std::swap does not call my custom swap implementation c++11
我有这样的代码:
#include <utility>
#include <iostream>
struct thing {
void swap(thing & other){
std::cout << "swap method" << std::endl;
}
};
void swap(thing & a, thing & b) {
std::cout << "swap function" << std::endl;
a.swap(b);
}
struct another{
thing a;
};
int main(int argc, char** argv){
another a, b;
std::swap(a, b);
}
如果执行,它不会打印任何内容 - 例如它不使用我的 "custom" swap
.
我读过我不应该 std::swap 专业化。
我是否需要为 class another
进行自定义交换,或者我遗漏了什么?
std::swap
不会调用您的 swap
实现。你应该做的(在通用代码中)是让重载决议选择你自己的:
namespace stuff
{
struct foo { void swap(foo& other); };
swap(foo& lhs, foo& rhs) { lhs.swap(rhs); }
}
int main()
{
foo a, b;
int i = 0;
int j = 42;
using std::swap;
swap(i, j); // calls std::swap
swap(a, b); // calls stuff::swap(stuff::foo&, stuff::foo&) via ADL
}
您明确调用 std::swap
- 没有理由调用您的自定义方法。
但是,如果您更改它 - 请务必更改方法的接口 - 在这种形式下会出现编译错误。
您的 swap
期望 thing
的。这是你想要的吗?
int main(int argc, char** argv){
another a, b;
using std::swap; // let the compiler decide which swap to use
swap(a.a, b.a); // calls swap(thing & a, thing & b) and thing.swap
}
我有这样的代码:
#include <utility>
#include <iostream>
struct thing {
void swap(thing & other){
std::cout << "swap method" << std::endl;
}
};
void swap(thing & a, thing & b) {
std::cout << "swap function" << std::endl;
a.swap(b);
}
struct another{
thing a;
};
int main(int argc, char** argv){
another a, b;
std::swap(a, b);
}
如果执行,它不会打印任何内容 - 例如它不使用我的 "custom" swap
.
我读过我不应该 std::swap 专业化。
我是否需要为 class another
进行自定义交换,或者我遗漏了什么?
std::swap
不会调用您的 swap
实现。你应该做的(在通用代码中)是让重载决议选择你自己的:
namespace stuff
{
struct foo { void swap(foo& other); };
swap(foo& lhs, foo& rhs) { lhs.swap(rhs); }
}
int main()
{
foo a, b;
int i = 0;
int j = 42;
using std::swap;
swap(i, j); // calls std::swap
swap(a, b); // calls stuff::swap(stuff::foo&, stuff::foo&) via ADL
}
您明确调用 std::swap
- 没有理由调用您的自定义方法。
但是,如果您更改它 - 请务必更改方法的接口 - 在这种形式下会出现编译错误。
您的 swap
期望 thing
的。这是你想要的吗?
int main(int argc, char** argv){
another a, b;
using std::swap; // let the compiler decide which swap to use
swap(a.a, b.a); // calls swap(thing & a, thing & b) and thing.swap
}