2015-02-08 176 views
1

在搜索論壇尋找答案後,我似乎無法解決此問題。將函數作爲參數傳遞給方法C++

爲了教學目的,我創建了一個(模板)鏈表類。我班有以下方法:

template <typename E> 
bool List<E>::hasValue(E value, bool (*fn)(E, E)){ 
    bool hasValue = false; 
    node* c = head; 
    while (true) { 
     if (c->value == value) { 
      hasValue = true; 
      break; 
     } 
     else if (c->next != 0) { 
      c = c->next; 
     } 
     else { 
      break; 
     } 
    } 
    return hasValue; 
} 

我想bool (*fn)(E, E)是任何重載==操作符用戶像這樣定義的:

struct record { 
    string name; 
    int age; 
}; 

bool operator==(const record& r1, const record& r2) { 
    bool result = false; 
    if (r1.name == r2.name && r1.age == r2.age) { 
     result = true; 
    } 
    return result; 
} 
然而

如果我叫list.hasValue({"duder", 20}, operator==) Xcode的報告:

沒有找到匹配的成員函數調用'hasValue'

我似乎無法找到任何這種情況發生的原因的在線解釋。

+0

你'==操作符'碼相當複雜。你可以(也應該)簡單地使用'return r1.name == r2.name && r1.age == r2.age;'。 – 2015-02-08 16:00:07

+0

@KonradRudolph你是對的。 – dude 2015-02-08 16:13:03

回答

1

沒有你想要的東西像

if ((*fn)(c->value,value)) {...} 

還,我建議傳遞的參數爲const引用。

此外,由於這是一個模板函數,你確定你在聲明的同一頭文件中定義函數嗎?

1

您可以使用一個通用的比較概念:

template <typename E, typename Comp> 
bool List<E>::hasValue(E value, Comp fn) { ... } 

這可以讓你避免需要指定函數簽名(這實際上獲得你什麼)。

然後你可以稱其爲:

list.hasValue(record{"duder", 20}, std::equal_to<record>()); 

其中std::equal_to<functional>進口。如果它存在,這個函子will call operator==


其實我也建議,對於語義而言,自動默認爲您hasValue定義使用std::equal_to如果比較沒有明確定義:

template <typename E, typename Comp = std::equal_to<E>> 
bool List<E>::hasValue(E value, Comp fn = {}) { ... } 
相關問題