Я пытаюсь использовать идиому pimpl для использования <vector> libray в XCode 5.0 в моем проекте Objctive C. Мне удалось реализовать его, но это только для типа int, как вы можете видеть в моем файле.h и.mm.
файл.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;
файл.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
Я хотел бы реализовать типичный тип (возможно, шаблон?), Поскольку yuo будет делать в библиотеке, но я понятия не имею, как этого добиться. Буду признателен за любую оказанную помощь.
Предполагая, что вы хотите std::vector<std::vector<int>>
шаблон std::vector<std::vector<int>>
: есть две возможности:
void*
и позаботьтесь о преобразовании внутри класса.Для второго варианта достаточно создать экземпляр класса шаблона для каждого типа, чтобы компилятор знал, какие типы используются.
Также посмотрите на этот связанный вопрос: pimpl для шаблонного класса.
void*
. Затем вам нужно позаботиться о преобразовании типов, где вы можете i) определить явные функции преобразования или ii) передать длину одного элемента в байтах. Но, если вы используете i), вы также можете использовать создание экземпляра класса шаблона для каждого поддерживаемого типа.
int
внутриvector
.