我正在编写一个自定义类,我想为其使用 std::swap 函数。
正如我在这篇文章中读到的 How to overload std::swap() ,我必须在我尝试交换的对象的同一个命名空间中重载它,这里有一个例子。
I (thing) 我正在复制示例,但是在使用 std::swap()
时调用的函数不是我定义的函数。
这是我的代码:
//grid.hpp
namespace myname {
template <typename T>
class Grid
{
...
friend void swap(Grid &a, Grid &b)
{
using std::swap;
std::cout << "Custom Swap Used" << std::endl;
swap(a.nrwow, b.nrows);
swap(a.ncols, b.ncols);
a.grid.swap(b.grid);
}
}
}
但是当我调用交换函数时没有字符串被打印出来,所以这个函数没有被调用。
//file.cpp
#include"../src/grid.hpp"
int main() {
myname::Grid<int> grid1(10, 10);
myname::Grid<int> grid2(10, 10);
std::swap(grid1, grid2); // this should print a string
}
最佳答案
你必须使用 std::ranges::swap
,或者如果您不使用 C++20,则通过 ADL 找到它:
myname::Grid<int> grid1(10, 10);
myname::Grid<int> grid2(10, 10);
std::ranges::swap(grid1, grid2);
// Or with ADL
using std::swap;
swap(grid1, grid2);
"Swapping"并不完全意味着 std::swap
, 但这种形式的“using std::swap; swap(x, y);
”, 被 std::ranges::swap
封装.
写作 std::swap(grid1, grid2)
直接调用默认的 template<typename T> void std::move(T&, T&);
.这将使用移动构造和移动赋值运算符而不是您的自定义交换函数,这就是您看不到 "Custom Swap Used"
的原因。 .
关于交换函数的 C++ 重载不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70645649/