我有一個C++類,其中一個字段是一個std ::對象集。我想寫我自己的比較函數,或讓用戶指定一個。在C++ 11中,有一種處理通用函數類型的新方法:std :: function。它可以與函數指針,成員函數指針,lambda函數等一起工作。C++ 11 std ::函數和std ::引用包裝用於排序std :: set
我試着編寫一個簡單的實驗程序,但它始終如一地工作,即使我做C++ 11維基百科文章的建議。也許我只是不明白如何使用std :: function和std :: ref。
無論如何,關鍵是當我從一個簡單的lambda函數創建一個std ::函數並將其作爲一個類成員時,該類的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 ::設置使用std ::功能,並有許多MyClass的對象使用相同的功能?
我希望能夠在運行時更改比較函數,以便用戶能夠選擇集合中的對象(通過GUI顯示)的排序。
相反的描述你做什麼或想以文字做的,爲什麼不能讓一個[ SSCCE](http://sscce.org/)並向我們展示實際的代碼? – 2013-02-15 11:00:01
因爲我從來沒有聽說過任何叫做SSCCE的東西,因爲我沒有實際的代碼;我發佈了這個問題,因爲我正在尋找如何正確編寫它的指導。 (我得到了指導,看到下面的答案) – cfa45ca55111016ee9269f0a52e771 2013-02-15 12:45:58