从Java翻译:如何在C ++中为枚举类型定义lambda成员?

时间:2017-06-15 23:14:47

标签: c++ lambda enums

在Java中,可以对进行以下操作,例如定义简单计算的不同变体(在这种情况下,从文档总数D和数量文档中反转文档频率权重包含术语d):

package an.nlp.library.weights;

import java.util.function.BiFunction;

public enum IDF implements BiFunction<Long,Long,Double> {
    UNARY( ( D, d ) -> 1d ),
    IDF(   ( D, d ) -> Math.log(   D / d     ) ),
    IDFS(  ( D, d ) -> Math.log1p( D / d     ) ),
    PIDF(  ( D, d ) -> Math.log(   D - d / d ) ),
    ;

    private BiFunction<Long,Long,Double> func;

    private IDF( BiFunction<Long,Long,Double> func ) {
        this.func = func;
    }

    public Double weight( long D, long d ) {
        return func.apply( D, d );
    }

    @Override
    public Double apply( Long t, Long u ) {
        return func.apply( t, u );
    }
}

然后可以通过例如:

从客户端代码调用它
getIdf( long D, long d, IDF mode ) {
    return mode.apply( D, d );
}

如何在C ++中实现相同的目标?就像这样的东西,比如说:

// Obviously wrong, as I have no idea how to do it, hence the qeustion:
std::vector<double> getIdfWeights( long D, std::vector<double> ds, IDF mode ) {
    return std::transform( ds.begin(), ds.end(), ds.begin(), IDF );
}

换句话说,用于将1)成员添加到C ++中的枚举类型的正确语法是什么?2)那些成员值是lambda,然后可以从其他地方调用?从我一直在阅读的内容来看,这显然是enum课程的用途,但我是一个C ++ n00b,所以我不能完全理解这些是如何工作的。

1 个答案:

答案 0 :(得分:2)

C ++中的枚举只是整数值。他们不能拥有会员。 enum class只是从枚举值中删除整数转换。

你可以做一些类似的事情,例如

class Foo
{
    int(*)(int) func;
    int value;
public:
    operator int() {
        return value;
    };
    int operator()(int i) {
        return func(i);
    }
    static constexpr Foo Value_A = { frob, 0 };
    static constexpr Foo Value_B = { mung, 1 };
};