在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,所以我不能完全理解这些是如何工作的。
答案 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 };
};