私は定期的な比較クラスまたは関数を渡してset :: set <>にする方法を知っています。std :: set比較関数のカスタム引数
私はいくつかのテストコードを書いており、STLのstd :: setを使っていくつかのCライブラリをエミュレートしたいと思います。比較オブジェクトにCコールバックを渡して別の比較が行われるようにします。
私は、次の理論のコードがあります。その後、
std::set<MyClass, MyComparison> m1;
しかし、私は、何とか、MyComparisonオブジェクトをインスタンス化することはできません、 "CMP" を渡すと:
struct MyClass
{
int a;
};
typedef bool (*user_callback_t)(void *, void *);
class MyComparison
{
private:
user_callback_t cb = nullptr;
public:
MyComparison(user_callback_t cb): cb(cb) { }
MyComparison() {}
bool operator()(const MyClass &a, const MyClass &b) const
{
return cb((void *)&a, (void *)&b);
}
};
int f1()
{
auto cmp = [](void *a, void *b) -> bool
{
return *(int *)a < *(int *)b;
};
MyComparison mycmp(cmp);
std::set<MyClass, MyComparison> m1;
m1.insert({ 1 });
m1.insert({ 2 });
m1.insert({ 3 });
return 0;
};
は、今私が行うことができますどのように通知をその特定のセットで比較オブジェクトを初期化することを使用してください。
これを達成する方法はありますか?
なぜあなたはできませんか? Btw、あなたは 'MyClass'のコンテナを持っているときに整数を比較しています。それがUBです。 – krzaq
@krzaq http://stackoverflow.com/questions/7160901/why-is-c11s-pod-standard-layout-definition-the-way-it-isの最初の回答を参照してください。しかし、はい、なぜあなたはできませんか? – immibis
おそらく[いくつかのドキュメントを読む](http://en.cppreference.com/w/cpp/container/set/set)。 – juanchopanza