шаблон pimpl в задаче C

0

Я пытаюсь использовать идиому 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 будет делать в библиотеке, но я понятия не имею, как этого добиться. Буду признателен за любую оказанную помощь.

  • 0
    Вы пытаетесь реализовать универсальный класс object-c (например, использовать NSNumber вместо int для вашего класса target-c) или вы пытаетесь использовать шаблоны C ++?
  • 0
    @NonlinearIdeas Я думаю, что он хочет шаблонировать int внутри vector .
Теги:
templates
pimpl-idiom

1 ответ

0
Лучший ответ

Предполагая, что вы хотите std::vector<std::vector<int>> шаблон std::vector<std::vector<int>>: есть две возможности:

  • Используйте слабый тип, например void* и позаботьтесь о преобразовании внутри класса.
  • Внедрите интерфейс для каждого типа, который вы хотите поддерживать.

Для второго варианта достаточно создать экземпляр класса шаблона для каждого типа, чтобы компилятор знал, какие типы используются.

Также посмотрите на этот связанный вопрос: pimpl для шаблонного класса.

  • 0
    Мне нравится идея пустого указателя, но я не знаю, как использовать код pimpl для его получения. Любой намек, пожалуйста?
  • 0
    В основном функции интерфейса, например, для добавления / удаления элементов, принимают void* . Затем вам нужно позаботиться о преобразовании типов, где вы можете i) определить явные функции преобразования или ii) передать длину одного элемента в байтах. Но, если вы используете i), вы также можете использовать создание экземпляра класса шаблона для каждого поддерживаемого типа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню