从 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 );
(注:Point
、Size
和 PolylineElement
是本地 C++ 结构。)我在我的 Objective-C++ 包装器中为 std::vector<T>
使用什么签名?
【问题讨论】:
NSArray<PolylineElementWrapperYouCreate*> *
,你的包装器将负责桥接这两种类型。
我在包装 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++ - std::vector<T> 的等价物