2016-03-14 79 views
1

所以假設我有一個像這樣的一系列自定義比較:如何自定義比較傳遞給自定義函數的C++

template <typename T> 
class less_class { 
    bool operator() (T obj, T value) const { 
     return obj < value; 
    } 
}; 

template <typename T> 
class greater_than { 
    bool operator() (T obj, T value) const { 
     return obj > value; 
    } 
}; 

template <typename T> 
class equal_to { 
    bool operator() (T obj, T value) const { 
     return obj == value; 
    } 
}; 

,我有這樣的功能:

template <typename T> 
bool compare_values(T obj, T value, T comparator(T obj, T value)) { 
    if comparator(obj, value) return true; 
    return false; 
} 

什麼語法我應該在compare_values函數中使用它,以便它可以使用上述任一比較器並在其實現中使用它?目前,我的函數比較器參數是以類似於上面的方式編寫的,Xcode正在拋出錯誤。我曾嘗試搞亂這些爭論,看看有什麼可行的,但我想我需要更好地理解我在這裏要做的事情。任何幫助,將不勝感激!

+2

注意你的類已經是標準的:'std :: less','std :: greater_than' ecc。 – edmz

+0

你的比較器應該是'public'作爲修飾符的結構或類。 – Goodies

回答

7

你會想只是把它作爲一個模板:

template <typename T, typename F> 
bool compare_values(T const& obj, T const& value, F comparator) { 
    return comparator(obj, value); 
} 

bool equal = compare_values(1, 1, less_class<int>{}); 

雖然所有的operator()的是目前private,這不是特別有用。此外,您將通過值來獲取所有參數,您應該通過引用const來避免不必要的副本。


而且,這些已經存在的std::lessstd::greaterstd::equal_to

+0

您也可以通過前向參考'F &&比較器'傳遞'F'。 – vsoftco