独自の swap 関数を定義するファンクターを作成しました。簡単にするために、ファンクタの演算子シグネチャが int (int) であると仮定します。std_func1 と std_func2 など、そのファンクターで 2 つの std::function を初期化すると、それらを交換すると、ユーザーが実装したファンクターのスワップ関数が呼び出されますか? 前もって感謝します。
これが私が試したことです:
#include <iostream>
#include <vector>
#include <boost/function.hpp>
using namespace std;
class myclass {
public:
myclass(int n):data_(n,0){}
void swap(myclass& rhs) {
using std::swap;
std::cout << "swapping myclass" << '\n';
data_.swap(rhs.data_);
}
private:
vector<int> data_;
};
struct square {
square(int n):B(n){}
int operator()(int x) {
return x*x;
}
myclass B;
void swap(square& rhs) {
using std::swap;
std::cout << "swapping square" << '\n';
B.swap(rhs.B);
}
};
void swap(myclass& a, myclass& b) {
a.swap(b);
}
void swap(square& a, square& b) {
a.swap(b);
}
using myfunction = std::function<int (int)>;
int main () {
myfunction myf1(square(10));
myfunction myf2(square(20));
myf1.swap(myf2); /* does not use user-implemented swap functions */
return 0;
}