0

独自の 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;
}
4

2 に答える 2

2

ドキュメントからstd::swap

大きなデータ型は、パフォーマンスを最適化するこの関数のオーバーロードされたバージョンを提供できます。特に、すべての標準コンテナは、コンテンツ全体ではなく少数の内部ポインタのみが交換されるように特殊化されており、一定時間で動作します。

標準ライブラリ (std 内) の多くのコンポーネントは、swap を非修飾の方法で呼び出して、このジェネリック バージョンの代わりに非基本型のカスタム オーバーロードを呼び出すことができるようにします。提供されたものは、このジェネリック バージョンに対する引数依存のルックアップによって選択されます。

free 関数のドキュメントstd::swap(std::function)には次のように書かれています。

lhs.swap(rhs) を効果的に呼び出します。

メンバー関数のドキュメントstd::function::swapでは、そのようなものは何も指定されていません。

したがって、基本的に、答えは「それについて保証はありません」です。最初の引用から、ほとんどの実装が への非修飾呼び出しを使用してユーザー定義のものを呼び出すことが合理的であるように思われるとしてもswap

于 2013-07-31T09:01:05.603 に答える