C ++ 11:将函数指针(模板化,非成员函数)存储到Java的类

时间:2016-08-16 08:54:45

标签: java templates function-pointers

我主要不是Java程序员...我想找到一个相应的Java语法,用于将函数指针(模板化)存储为变量的类。函数指针指向类“外部”的函数。原始代码在C ++ 11中:

#include <memory>

template <typename T>
using p_function = T(*)(T, T, T);

template <typename T>
class A
{
   private:
      int k;
      p_function<T> pf;
   public:
      A() { pf = NULL; k = 0; }
      A(p_function<T> pf_, int k_) { pf = pf_; k = k_; }
      T getF(const T a1, const T a2, const T a3) const { return pf(a1, a2, a3); }
};

template <typename T>
T f1(T x, T y, T z) { return x + y + z; }

template <typename T>
T f2(T x, T y, T z) { return x - y - z; }

int main()
{
    A<double> aa (f1<double>, 1.0);
    double val= aa.getF(1.0, 2.0, 3.0);
}

考虑到这个问题,使用界面是否合理?

 public interface Function <T> {
    T pf(T x, T y, T z);
 }

或者,还有更好的方法吗? Java发展相对较快,可能比几年前有“更直接”的结构。有几个要求我无法联合起来。我可以在Java中要求一个简短的代码示例吗?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

使用java 8.它使用“功能”接口(实际上),其中接口只定义一个单独的函数。

为了不过度使用现有的Function类,请引入自己的名称。

@FunctionalInterface
public interface TriFunction<T> {
    T apply(T x, T y, T z);
}

使用FunctionalInterface注释标记它是一种阻止添加第二个函数等的做法。

class Foo {
    public static Bar hop(Bar x, Bar y, Bar z) { ... }
}

TriFunction<Bar> pf = Foo::hop;
TriFunction<Integer> pg = (x, y, z) -> x + y + z;
Bar bara = pf.apply(a, b, c);

对于基本类型,更好地定义没有通用参数类型的自己的接口。高于pg需要3次来打开包装器对象,并且一次将它再次装入对象。

java.util.function包含许多功能界面,例如BinaryOperatorIntBinaryOperator

答案 1 :(得分:-1)

我不确定我是否正确地提出了您的问题,但请查看this stackoverflow post

关于如何在java中实现函数指针有几个答案。

修改

我在C ++中没有足够的经验来提供代码示例。

编辑2

根据我上面提到的帖子,你可以尝试这样的事情:

public class WithFunction {

//Empty constructor, can be left out
public WithFunction () {...}

//The function you want to reference
public int myReferencedFunction () {...}
}

然后

public class MethodCaller {
  public static Object call (Object theObject, String methodName) {
    return theObject.getClass().getMethod(methodName).invoke(theObject);
    //catch Exceptions
  }
}

然后你可以像

那样
public static void main (String [] args) {
  WithFunction obj1 = new WithFunction();
  Object result = MethodCaller.call (obj1, "toString");
  int result = (int) MethodCaller.call (obj1, "myReferencedFunction");
}

注意:

你需要抓住很多例外。需要强大的错误处理..

如果您使用界面,您也可以多次实施它,并且应该拥有您需要的自由