2010-10-22 129 views
0

(C++)我有很多Entry類,並且獲得了包含Entry處理邏輯的BaseProcessor接口。 (見下面的代碼)使用函數指針作爲模板參數

該條目不提供運營商<()。 BaseProcessor提供了一個指向特定BaseProcessor實現的less(Entry,Entry)函數的指針。

我可以使用函數指針來比較我的程序中的Entry實例。然而,我需要創建std :: set(或std :: map或其他使用less())的Entry類。我試圖使用std :: binary_function派生類將它傳遞給std :: set,但它看起來像我不能將函數指針值傳遞給模板。

我該怎麼做?用C++ 03可以嗎?

謝謝。

struct Entry 
{ 
    // ... 
private: 
    bool operator< (const Entry &) const; // Should be defined by BaseProcessor. 
}; 

typedef bool (*LessFunc)(const Entry &, const Entry &); 

class BaseProcessor 
{ 
public: 
    // ... 
    virtual LessFunc getLessFunc() const = 0; 
}; 

// ... 

BaseProcessor *processor = getProcessor(); 
LessFunc lessfunc = processor->getLessFunc(); 

Entry e1; 
Entry e2; 
bool isLess = lessfunc(e1, e2); // OK 

typedef std::set<Entry, ???> EntrySetImpl; // how to use lessfunc here? 
EntrySetImpl entries; 

回答

5

你試過嗎?

typedef std::set<Entry, LessFunc> EntrySetImpl; 
EntrySetImpl entries(lessfunc); 

請注意,您需要指定的比較函數或對象作爲模板參數set類型,然後給它一個比較函數的實例或對象時,實際上創建了一組。


我將修改我的回答對您解決後續問題,因爲它是一個更容易一些。

您可以定義模板是這樣的:

template <LessFunc func> class MyContainer { /*code*/ }; 

然而,美中不足的是,你必須指定一個特定功能,不是一個函數指針變量,作爲模板參數。因此,舉例來說,這是確定:

bool CompareEntries1(const Entry &, const Entry &); 
MyContainer<CompareEntries1> container; 

...但是這是不正常:

bool CompareEntries1(const Entry &, const Entry &); 
LessFunc lessfunc = &CompareEntries1; //or any other way of getting a LessFunc 
MyContainer<lessfunc> container; 

如果你已經使用數組模板類,像boost::array,你可能已經看到類似的東西這之前。例如,您可以編寫array<int, 10>來聲明10個元素的數組,但不能寫入array<int, abs(x)>。數組的大小必須是編譯器在編譯程序時可以被告知的事情,但在它運行之前。 (關於什麼是允許的,有一套非常具體的規則 - 即使編譯器似乎應該能夠計算出模板參數是什麼,就像上面的LessFunc示例一樣,它仍然必須遵循特定的規則。在函數指針模板參數的情況下,參數必須是函數的名稱,或者後跟函數的名稱。)

+0

是的,它的工作原理。萬分感謝。 – Rom098 2010-10-22 11:50:15

+0

但是...它看起來像沒有辦法使用函數指針值作爲非類型模板參數。對?像「template class Comparator {...}」 – Rom098 2010-10-22 11:54:34

+0

@Roman - 你也可以這樣做,對於你寫的類,但是'set'不能像那樣工作。但是,您指定爲模板參數的'LessFunc'必須是編譯時常量(例如,它不能是調用函數的結果)。 – Doug 2010-10-22 11:59:39