从 Swift 调用 C++ - std::vector<T> 的等价物

Posted

技术标签:

【中文标题】从 Swift 调用 C++ - std::vector<T> 的等价物【英文标题】:Calling C++ from Swift - what is the equivalent of std::vector<T> 【发布时间】:2015-11-04 15:53:37 【问题描述】:

我正在通过SwiftArchitect's example 之后的桥接头从 Swift 调用 C++ 函数。 C++ 函数的签名是这样的:

long GrabberInitializeAndProcess(
    unsigned char* pbInPixels,  
    int inStride,
    unsigned char* pbOutPixels, 
    int outStride,
    int width, 
    int height,
    Point mqTopLeft, 
    Size mqSize,
    std::vector<PolylineElement> * pForegroundMarks, 
    std::vector<PolylineElement> * pBackgroundMarks,
    void* pGrabberState );

(注:PointSizePolylineElement 是本地 C++ 结构。)我在我的 Objective-C++ 包装器中为 std::vector&lt;T&gt; 使用什么签名?

【问题讨论】:

NSArray&lt;PolylineElementWrapperYouCreate*&gt; *,你的包装器将负责桥接这两种类型。 我在包装 PolylineElement 时遇到了麻烦(它是一个由四个整数组成的简单结构),但我将把它作为一个单独的问题提出。你想添加你的评论作为答案,我会这样标记它吗? 【参考方案1】:

您正在使用向量作为指针。当你需要在 Swift 中使用它时非常好。

您可以改用void*

long GrabberInitializeAndProcess(
    unsigned char* pbInPixels,  
    int inStride,
    unsigned char* pbOutPixels, 
    int outStride,
    int width, 
    int height,
    Point mqTopLeft, 
    Size mqSize,
    void * pForegroundMarks, 
    void * pBackgroundMarks,
    void* pGrabberState );

并在实现中执行类型转换。

或者如果你需要类型安全,你可以白:

typedef struct _vectorOfPolylineElement *vectorOfPolylineElementPtr;

long GrabberInitializeAndProcess(
    unsigned char* pbInPixels,  
    int inStride,
    unsigned char* pbOutPixels, 
    int outStride,
    int width, 
    int height,
    Point mqTopLeft, 
    Size mqSize,
    vectorOfPolylineElementPtr pForegroundMarks, 
    vectorOfPolylineElementPtr pBackgroundMarks,
    void* pGrabberState );

并在实施中:

typedef struct _vectorOfPolylineElement

    std::vector<PolylineElement> val;
 *vectorOfPolylineElementPtr;

如果您实际上不需要 GrabberInitializeAndProcess 中的向量,只需使用可以使用内存的元素:

long GrabberInitializeAndProcess(
    unsigned char* pbInPixels,  
    int inStride,
    unsigned char* pbOutPixels, 
    int outStride,
    int width, 
    int height,
    Point mqTopLeft, 
    Size mqSize,
    PolylineElement * pForegroundMarks, 
    size_t foregroundMarksCount,
    PolylineElement * pBackgroundMarks,
    size_t backgroundMarksCount,
    void* pGrabberState );

【讨论】:

以上是关于从 Swift 调用 C++ - std::vector<T> 的等价物的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 将文件作为参数传递给 C++ 方法

从 Swift 调用 C++ - std::vector<T> 的等价物

预期的枚举`std::result::Result`,发现结构`std::vec::Vec`。

C++ 返回对向量中值的引用

如何打印 Vec?

使用另一个 C++ 类作为参数从 Objective-C(++) 调用 C++ 方法