我有一个 C++ 类,它的一个字段是 std::set 对象。我想自己写一个比较函数,或者让用户指定一个。在 C++11 中有一种处理泛型函数类型的新方法:std::function。它适用于函数指针、成员函数指针、lambda 函数等。
我尝试编写一个简单的实验程序,但它一直在卡顿,即使我按照 C++11 维基百科文章的建议进行操作。也许我只是不明白应该如何使用 std::function 和 std::ref 。
无论如何,关键是当我从一个简单的 lambda 函数创建一个 std::function 并使其成为类成员时,该类的 sizeof 增长了 22。当我从一个指向全局函数的指针创建一个 std::function 时,这个 std::function 的 sizeof 是 32。所以大小很大。我将有许多对象使用相同的比较函数,所以我更喜欢让所有对象都使用一个函数。
我有两个想法,告诉我你的想法。一个想法,使用 std::ref 存储对函数的引用,这样我可以定义一个函数,许多对象将使用它来比较 std::set 元素。第二个想法:如果它不能那样工作,或者生成的函数对象太大,也许我可以使用 shared_ptr。
您可能想知道:为什么没有一个静态 std::function 成员?答案是:因为所有对象都将使用相同的比较函数。例如,我希望能够拥有 1000 个对象,其中 400 个使用一个比较函数,600 个使用不同的比较函数。
例子:
class MyClass
{
public:
private:
std::function<bool (int, int)> compare;
std::set<int> set;
};
现在如何让 std::set 使用 std::function,并让许多 MyClass 对象使用相同的函数?
我希望能够在运行时更改比较功能,以便用户能够选择集合中对象的顺序(由 GUI 显示)。