C++ クラスがあり、そのフィールドの 1 つはオブジェクトの std::set です。独自の比較関数を作成するか、ユーザーに指定させたい。C++11 では、汎用関数型を処理する新しい方法 std::function があります。関数ポインター、メンバー関数ポインター、ラムダ関数などで動作します。
簡単な実験プログラムを作成しようとしましたが、C++11 Wikipedia の記事が示唆していることを実行しても、常にクラッシュし続けます。std::function と std::ref がどのように使用されることになっているのかわからないだけかもしれません。
とにかく、ポイントは、単純なラムダ関数から std::function を作成し、それをクラス メンバーにしたときに、クラスの sizeof が 22 増加したことです。グローバル関数へのポインターから std::function を作成したとき、この std::function の sizeof は 32 でした。したがって、サイズは大きいです。同じ比較関数を使用するオブジェクトが多数あるので、それらすべてで 1 つの関数を使用することを好みます。
2つの考えがあります、あなたの考えを教えてください。1 つのアイデアは、std::ref を使用して関数への参照を格納することです。このようにして、1 つの関数を定義でき、多くのオブジェクトがそれを使用して std::set 要素を比較します。2 番目のアイデア: そのように機能しない場合、または結果の関数オブジェクトがとにかく大きすぎる場合は、shared_ptr を使用できます。
あなたは疑問に思うかもしれません: 静的な std::function メンバーが 1 つないのはなぜですか? 答え: すべてのオブジェクトが同じ比較関数を使用するためです。たとえば、ある比較関数を使用して 400 個、別の比較関数を使用して 600 個のオブジェクトを 1000 個持つことができるようにしたいと考えています。
例:
class MyClass
{
public:
private:
std::function<bool (int, int)> compare;
std::set<int> set;
};
std::set で std::function を使用し、多くの MyClass オブジェクトで同じ関数を使用するにはどうすればよいでしょうか。
実行時に比較関数を変更できるようにして、ユーザーがセット内のオブジェクト (GUI で表示される) の順序を選択できるようにしたいと考えています。