2016-03-14 80 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