我有一个自定义列表类,并且希望使用STL中已知的“比较运算符”来支持操作。例如:
std::list<MyClass> d;
struct not_key {
not_key( std::string const& str) : str_(str) {}
bool operator( MyClass& elem ) {
return !elem.findThatThing();
}
std::string str_;
};
not_key comp("value");
d.remove_if( comp );
mylist<MyClass> e(d);
e.filter( comp );
我正在努力寻找接受这些“一般”比较运算符的方法的签名。因为它们都有不同的类型,我不想要静态成员函数。如何向接受比较运算符的类添加方法?
非常感谢! :)
答案 0 :(得分:4)
如果你的意思是你想知道mylist :: filter的签名,你可能只是将它作为一个模板,使用Pred或类似的类型。
template< typename T >
class mylist
{
public:
template< typename Pred >
void filter( Pred pred )
{
// implement, calling pred(elem) for each element or pred(*iter)
}
};
请注意,您可以将自由函数传递给该模板函数,在C ++ 11中,您将能够传入lambda。
如果你想要的东西不是模板(除了元素类型),你可以使用boost::function
(或std::function
)
答案 1 :(得分:3)
标准函数(例如std::sort
)使用模板参数,该参数被推断为比较函数类对象的类型:
template <class UnaryPredicate>
void filter(UnaryPredicate func) {
// Call it like:
func(something);
}
现在UnaryPredicate
将被推断为您传递给它的任何类似函数的对象的类型。 UnaryPredicate
比将它称为比较函数更有意义,因为它只需要一个参数。比较函数通常需要两个参数并进行比较。
或者,您可以选择std::function<bool(const MyClass&)>
:
void filter(std::function<bool(const MyClass&)> func) {
// Call it like:
func(something);
}
答案 2 :(得分:1)
签名应为:
bool operator()(Myclass const & elem) const