简单的方法使std :: compare函数一元

时间:2015-08-11 08:32:51

标签: c++ c++11

我需要使用不同的比较函数作为一元函数,其中一个值嵌入在比较器中。为此,我创建了一个适配器类,如:

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>>;

我的问题是:是否有更简单的方法(不使用适配器类)来定义那些一元比较器?我认为这是一个非常普遍的问题,可能你有更好的解决方案。

2 个答案:

答案 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); }; } 返回函数对象。

Live on Coliru

答案 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);
    };
}

live on coliru