Haskell FFI:与简单的C ++接口?

从我目前阅读的内容来看,使用FFI和C ++是非常难以完成的。 最大的原因之一似乎是将C ++对象转换为Haskell。 我现在的问题是,我对C没有任何经验,但用C ++几年,我更喜欢OOP。 因此,我自然会喜欢从C ++中受益。

那么我可以编写C ++程序来设计Haskell FFI用来解决这些问题吗? C ++可以在底层做任何事情,但API应该是类C的,即我不交换对象,没有重载的顶级函数等等。 有没有什么缺陷需要注意?

(为了将我的项目与您可能熟悉的项目进行比较:请考虑使用SciPy的Weave来加速Python代码。)


是的,如果您在C ++代码之上公开C API,则可以通过FFI使用C ++代码。

一种常见的模式是简单地将所有类的“方法”作为C过程包装起来,这样该类的对象可以被当作不透明的指针来处理这些函数。

例如,给定代码( foo.h ):

class foo
{
public:
  foo(int a) : _a(a) {}
  ~foo() { _a = 0; } // Not really necessary, just an example

  int get_a() { return _a; }
  void set_a(int a) { _a = a; }

private:
  int _a;
}

...您可以轻松创建所有这些方法的C版本( foo_c.h ):

#ifdef __cplusplus
typedef foo *foo_ptr;
extern "C"
{
#else
typedef void *foo_ptr;
#endif

foo_ptr foo_ctor(int a);
void foo_dtor(foo_ptr self);

int foo_get_a(foo_ptr self);
void foo_set_a(foo_ptr self, int a);
#ifdef __cplusplus
} /* extern "C" */
#endif

然后,必须有一些适配器代码通过C ++接口( foo_c.cpp )实现C接口:

#include "foo.h"
#include "foo_c.h"

foo_ptr foo_ctor(int a) { return new foo(a); }
void foo_dtor(foo_ptr self) { delete self; }

int foo_get_a(foo_ptr self) { return self->get_a(); }
void foo_set_a(foo_ptr self, int a) { self->set_a(a); }

头文件foo_c.h现在可以包含在Haskell FFI定义中。

链接地址: http://www.djcxy.com/p/61179.html

上一篇: Haskell FFI: Interfacing with simple C++?

下一篇: Can the FFI deal with arrays? If so, how?