2013-10-27 61 views
0

我正在使用google sparse hashmap庫。我有以下類模板:如何傳遞類公共成員函數作爲模板參數?

template <class Key, class T, 
      class HashFcn = std::tr1::hash<Key>, 
      class EqualKey = std::equal_to<Key>, 
      class Alloc = libc_allocator_with_realloc<std::pair<const Key, T> > > 
class dense_hash_map { 
..... 
typedef dense_hashtable<std::pair<const Key, T>, Key, HashFcn, SelectKey, 
         SetKey, EqualKey, Alloc> ht; 
..... 

}; 

現在我已經定義我自己的類如:

class my_hashmap_key_class { 

private: 
    unsigned char *pData; 
    int data_length; 

public: 
    // Constructors,Destructor,Getters & Setters 

    //equal comparison operator for this class 
    bool operator()(const hashmap_key_class &rObj1, const hashmap_key_class &rObj2) const; 

    //hashing operator for this class 
    size_t operator()(const hashmap_key_class &rObj) const; 

}; 

現在我想通過my_hashmap_key_class作爲Keymy_hashmap_key_class::operator()(const hashmap_key_class &rObj1, const hashmap_key_class &rObj2)EqualKeymy_hashmap_key_class::operator()(const hashmap_key_class &rObj)HashFcndense_hash_map類作爲參數,同時在主要功能中使用它:

main.cpp:

dense_hash_map<hashmap_key_class, int, ???????,???????> hmap; 

傳遞類成員函數作爲模板參數的正確方法是什麼?

我想通過這樣的:

dense_hash_map<hashmap_key_class, int, hashmap_key_class::operator(const hashmap_key_class &rObj1, const hashmap_key_class &rObj2),hashmap_key_class::operator()(const hashmap_key_class &rObj)> hmap; 

,但我得到的編譯錯誤爲未檢測的操作。請幫助我認識到我做錯了什麼。

+1

我想你希望這些操作符是'靜態'。另外,爲什麼不使用'operator =='進行等式比較呢? (您仍然需要手動定義) – leemes

+1

使運算符爲'靜態'。 –

+2

或者使用相當奇怪的,但並非沒有聽說過的事實,即你的類是它自己的平等函子,並且只需傳遞'my_hashmap_key_class'。請注意,將構造一個實例來執行比較,而且這兩個參數都不是構造的比較器本身。 'HashFn'參數也是如此。我沒有經常看到它,但它應該像定義此代碼一樣無所不能。注意,你的班級必須支持默認構造(我假設它)。 – WhozCraig

回答

0

正如評論中所述,您應該將相等性寫爲operator==。此外,要麼使這些運算符爲靜態或移除其中一個參數(「this」指針將成爲相等性測試的左側操作數),否則它們將無法按預期工作。

//equal comparison operator for this class 
bool operator==(const hashmap_key_class &rObj2) const; 

//hashing operator for this class 
size_t operator()() const; 

然後,你的類準備好這樣的客戶端代碼:

my_hashmap_key_class a = ...; 
my_hashmap_key_class b = ...; 

a == b; // calls a.operator==(b), i.e. compares a and b for equality 
a();  // calls a.operator()(), i.e. computes the hash of a 

然後,你應該使用默認的模板參數罰款。

+0

這是真的.....但我對對象實例化或成員函數的定義方式不感興趣(因爲Google稀疏哈希代碼需要我們的類以特定格式)。而是如何使用成員函數作爲模板參數並利用它們。 「 – annunarcist

+0

」然後,你應該沒問題,通過使用默認的模板參數「是我需要知道的部分以及如何實現它 – annunarcist

+0

簡單地省略參數:'dense_hash_map '* should * do it,but I can不測試它。請報告這是否有問題。 – leemes

相關問題