我是否有可能使用Vala和C+保持类型安全和内存抽象+;? 我的问题是如何将C++与Vala进行接口,这是一个非常基本和最基本的问题,尤其是在内存、修改数据结构和类型安全方面。

我是否有可能使用Vala和C+保持类型安全和内存抽象+;? 我的问题是如何将C++与Vala进行接口,这是一个非常基本和最基本的问题,尤其是在内存、修改数据结构和类型安全方面。,c++,vala,C++,Vala,通常的答案是: 您可以“轻松地将其转换为C” 您可以使用一些等效的Glib函数/数据结构 问题是C甚至不接近C++所能提供的,只是时间的不同语言90%;另一方面,Glib的问题是它不是标准的,也不是C++,我有很多C++代码,我想以一种安全的方式重用,加上C++的编码对我来说更有效。 那么,当我想将std::vector传递给Vala或stringstream时会发生什么呢?当我的Vala程序想要复制、引用、编辑和调整/重新定位该容器时会发生什么 我不知道Vala是如何处理这个的,因为瓦拉河

通常的答案是:

  • 您可以“轻松地将其转换为C”
  • 您可以使用一些等效的Glib函数/数据结构
问题是C甚至不接近C++所能提供的,只是时间的不同语言90%;另一方面,Glib的问题是它不是标准的,也不是C++,我有很多C++代码,我想以一种安全的方式重用,加上C++的编码对我来说更有效。 那么,当我想将
std::vector
传递给Vala或
stringstream
时会发生什么呢?当我的Vala程序想要复制、引用、编辑和调整/重新定位该容器时会发生什么

我不知道Vala是如何处理这个的,因为瓦拉河的VAXI和底线是C,我找不到任何关于如何处理C++代码的具体答案。
<> P>考虑到我已经放弃GTKmm作为一个真正的选择,你认为我应该如何去Vala和C++?< /P> < P > Vala不支持C++。你无法找到如何处理C++代码的答案是,没有一个你没有。

<> P>从Vala中获得C++库的唯一方法是先用C编写包装器。如果您愿意,该包装器可以使用GLib——Vala无论如何都需要GLib,因此如果您计划使用Vala软件作为C API的唯一消费者,那么使用GLib并不会真正添加依赖项。也可以为std::vector或stringstream编写C绑定

如果您想用C++包装器来实现C++库的例子,请看Snaby或LealDB。它们都是创建简单C包装器的简单例子,尽管从API的角度看,这两个都不是特别好(实际上,我认为C++ API并不特别好,但是我觉得大多数C++ API……)。

如果你想保留处理所有类型的能力,你就不能在C++ API中获得C++模板的类型安全性。您必须在C API中使用void*(或者类似的东西,比如gpointer),但是您可以使用正确的绑定在Vala中获得类型安全性。例如,如果我想为std::vector创建一个绑定,那么C API的一部分可能如下所示

/* foo-vector.h */
#ifdef __cplusplus
extern "C" {
#endif

typedef void (*FooDestroyNotify) (void* data);
typedef struct _FooVector FooVector;

FooVector* foo_vector_new (FooDestroyNotify destroy_notify);
void foo_vector_free (FooVector* vec);
void foo_vector_push_back (FooVector* vec, void* value);
void* foo_vector_pop_back (FooVector* vec);

#ifdef __cplusplus
}
#endif

/*foo-vector.cpp*/
#包括
#包括
#包括
结构向量{
std::vector*vec;
食品销毁通知销毁通知;
};
FooVector*foo_vector_new(FooDestroy通知destroy_通知){
FooVector*vec=(FooVector*)malloc(sizeof(FooVector));
向量->向量=新的标准::向量;
vec->销毁通知=销毁通知;
返回向量;
}
void foo_vector\u push_back(FooVector*vec,void*value){
向量->向量->推回(值);
}
void*foo\u vector\u pop\u back(FooVector*vec){
void*res=NULL;
如果(!vec->vec->empty()){
res=vec->vec->back();
vec->vec->pop_back();
}
返回res;
}
void foo_vector_free(FooVector*vec){
如果(vec->destroy\u notify!=NULL){
std::vector::iterator it=vec->vec->begin();
对于(;itvec->end();it++){
vec->销毁通知(*it);
}
}
删除vec->vec;
免费(vec);
}
(如果不想使用glib,可以创建一个类似的typedef,而不是使用GDestroyNotify。)

然后,在VAPI中

[Compact]
public class Vector<T> {
    [CCode (simple_generics = true)]
    public Vector ();
    public void push_back (owned T value);
    public owned T pop_back ();
}
[Compact]
公共类向量{
[CCode(简单\u泛型=真)]
公共媒介();
公共无效推回(拥有的T值);
公有的T pop_back();
}

问题是它只适用于可以填充在指针中的类型。从C方面来说,这基本上是如何完成的,但是如果你需要绑定一些类似STD::vector,你需要创建一个专门的绑定,或者为你的API建模一个类似加赖的地方,你必须通过它的大小(这将不是有趣的使用瓦拉河)。< /P> < P> Vala不支持C++。你无法找到如何处理C++代码的答案是,没有一个你没有。

<> P>从Vala中获得C++库的唯一方法是先用C编写包装器。如果您愿意,该包装器可以使用GLib——Vala无论如何都需要GLib,因此如果您计划使用Vala软件作为C API的唯一消费者,那么使用GLib并不会真正添加依赖项。也可以为std::vector或stringstream编写C绑定

如果您想用C++包装器来实现C++库的例子,请看Snaby或LealDB。它们都是创建简单C包装器的简单例子,尽管从API的角度看,这两个都不是特别好(实际上,我认为C++ API并不特别好,但是我觉得大多数C++ API……)。

如果你想保留处理所有类型的能力,你就不能在C++ API中获得C++模板的类型安全性。您必须在C API中使用void*(或者类似的东西,比如gpointer),但是您可以使用正确的绑定在Vala中获得类型安全性。例如,如果我想为std::vector创建一个绑定,那么C API的一部分可能如下所示

/* foo-vector.h */
#ifdef __cplusplus
extern "C" {
#endif

typedef void (*FooDestroyNotify) (void* data);
typedef struct _FooVector FooVector;

FooVector* foo_vector_new (FooDestroyNotify destroy_notify);
void foo_vector_free (FooVector* vec);
void foo_vector_push_back (FooVector* vec, void* value);
void* foo_vector_pop_back (FooVector* vec);

#ifdef __cplusplus
}
#endif

/*foo-vector.cpp*/
#包括
#包括
#包括
结构向量{
std::vector*vec;
食品销毁通知销毁通知;
};
FooVector*foo_vector_new(FooDestroy通知destroy_通知){
FooVector*vec=(FooVector*)malloc(sizeof(FooVector));
向量->向量=新的标准::向量;
vec->销毁通知=销毁通知;
返回向量;
}
void foo_vector\u push_back(FooVector*vec,void*value){
向量->向量->推回(值);
}
void*foo\u vector\u pop\u back(FooVector*vec){
void*res=NULL;
如果(!vec->vec->empty()){
res=vec->vec->back();
vec->vec->pop_back();
}
返回res;
}
void foo_vector_free(FooVecto