我需要使用不同的比较函数作为一元函数,其中一个值嵌入在比较器中。为此,我创建了一个适配器类,如:
template<typename T, typename Compare>
class CompareAdaptor : private Compare
{
public:
CompareAdaptor(T value)
: mValue(value)
{
}
bool operator()(T v) const
{
return Compare::operator()(v, mValue);
}
private:
T mValue;
};
现在我可以定义一个新的一元比较器,如:
template<typename T>
using EqualTo = CompareAdaptor<T, std::equal_to<T>>;
template<typename T>
using LessEqual = CompareAdaptor<T, std::less_equal<T>>;
我的问题是:是否有更简单的方法(不使用适配器类)来定义那些一元比较器?我认为这是一个非常普遍的问题,可能你有更好的解决方案。
答案 0 :(得分:2)
在C ++ 11中,这是最好的。但我宁愿期望谓词直接在呼叫站点构建:
A[colnames(B)] <- B
在C ++ 14中,您可以使用返回类型推导来进行工厂功能:
std::find_if(begin(v), end(v), [limit](int i) { return i < limit; });
示例调用:template <class Comp>
auto predicate(typename Comp::second_argument_type rhs) {
return [c = Comp{}, rhs](typename Comp::first_argument_type lhs) {
return c(lhs, rhs);
};
}
返回函数对象。
答案 1 :(得分:1)
@Quentins的答案也可以在C ++ 11中使用std::function
作为lambda可转换为的返回类型进行编译:
template <class Comp>
std::function<typename Comp::result_type (typename Comp::first_argument_type)> predicate(typename Comp::second_argument_type rhs)
{
return [rhs](typename Comp::first_argument_type lhs){
Comp c{};
return c(lhs, rhs);
};
}