【问题标题】:PImpl template in Objective-CObjective-C 中的 PImpl 模板
【发布时间】:2014-01-16 16:03:53
【问题描述】:

我正在尝试使用 PImpl 习语在我的 Objective-C 项目中使用 <vector> 库。

我已经设法实现它,但它仅适用于 Int 类型,正如您在我的 .h.mm 文件中看到的那样。

file.h

#import <Foundation/Foundation.h>
struct Vector_impl;
@interface MM_Matrix : NSObject
{
    struct Vector_impl *MMVec;
}
    @property unsigned rows, columns;

- (MM_Matrix *) initwith:(int) n and: (int) m;
- (long) size: (int) n;

file.mm

#import "MM_Matrix.h"
#include <vector>

struct Vector_impl
{
    std::vector<std::vector<int>> matrix;
};
@implementation MM_Matrix : NSObject

- (MM_Matrix *) initwith:(int) n and:(int)m
{
    [self setRows:n];
    [self setColumns:m];
    MMVec = new Vector_impl;
    MMVec->matrix.resize(n);
    for (int i=0; i<n; i++) {
        MMVec->matrix[i].resize(m, 0);
    }
    return self;
}
- (long) size: (int) n
{
    return MMVec->matrix[n].size();
}
@end

我想实现一个泛型类型(可能是模板?),就像您在 &lt;vector&gt; 库中所做的那样,但我不知道如何实现。

【问题讨论】:

  • 您是在尝试实现一个通用的 object-c 类(例如,使用 NSNumber 而不是 int 作为您的objective-c 类)还是在尝试使用 C++ 模板?
  • @NonlinearIdeas 我想他想在vector 中模板化int

标签: objective-c templates objective-c++ pimpl-idiom


【解决方案1】:

假设你要模板std::vector&lt;std::vector&lt;int&gt;&gt;:有两种可能:

  • 使用弱类型,例如void* 并负责课堂内的转换。
  • 为您想要支持的每种类型实现一个接口。

对于第二个选项,为每种类型实例化模板类就足够了,这样编译器就知道使用了哪些类型。

也可以看看这个相关的问题:pimpl for a templated class

【讨论】:

  • 我喜欢 void 指针的想法,但我不知道如何利用 pimpl 的代码来获得它。请问有什么提示吗?
  • 基本上是接口函数,例如添加/删除元素需要void*。然后您必须注意类型转换,您可以在其中 i) 定义显式转换函数或 ii) 以字节为单位传递单个元素的长度。但是,如果您使用 i),您也可以使用实例化模板类来支持每种类型。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 2011-12-30
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
相关资源
最近更新 更多