Итак, у меня есть класс, который выполняет строковые манипуляции на основе метаданных, прикрепленных к каждому символу в строке. Внутренне я представляю это с помощью std::vector<CharacterType>
, где CharacterType
содержит, помимо прочего, рассматриваемый символ. Это внутреннее представление полезно для меня, но в конце манипуляций с пользователем класс заинтересован в самой строке.
Чтобы сделать это, я решил расширить std::vector<CharacterType>::iterator
, чтобы включить метод operator*()
, который возвращает символ, а не CharacterType
. Вот код, он работает в Visual Studio 2008 на Windows 7. Но это идиоматический C ++? Я не много писал на C ++ с 90-х годов, поэтому буду благодарен за отзыв о стиле или за то, что я делаю что-то опасное и / или злое. (В приведенном ниже коде я создал упрощенную структуру CharacterType
, которая называется mytype
- на самом деле структура немного больше.)
#include <iostream>
#include <vector>
#include <string>
struct mytype {
char c;
};
class myit : public std::vector<mytype>::iterator {
public:
inline myit(std::vector<mytype>::iterator const &c)
: std::vector<mytype>::iterator(c) {}
char operator*() {
const mytype &p =
std::vector<mytype>::iterator::operator*();
return p.c;
}
// Added these in a later edit, after thinking about a comment below
typedef char value_type;
typedef char *pointer;
typedef char &reference;
private:
};
int
main()
{
mytype test[] = { {'a'}, {'b'}, {'c'}, {'d'} };
std::vector<mytype> vec(&test[0], &test[4]);
myit i(vec.begin()), e(vec.end());
std::string str(i, e);
std::cout << str << std::endl;
return 0;
}
Если предположить, что это хороший стиль, уместно ли использовать перегрузку методов с учетом типов в C ++, чтобы в myit
было несколько operator*()
методов, чтобы я мог использовать один и тот же класс итератора для получения другого члена другого типа? Или лучше использовать шаблон? Например, одна часть метаданных - это язык персонажа, и я хотел бы иметь возможность извлечь std::vector<LanguageType>
точно таким же образом. Мысли?
Кроме того, поскольку методы, которые возвращают эти данные, не влияют на внутреннее представление объекта, в интересах правильности констант я хотел бы иметь возможность определить методы доступа const
. Это, вероятно, означает, что мне нужно изменить вышеприведенное, чтобы использовать вместо него const_iterator
, но я еще не дошел до этого.
Спасибо за вашу критику стиля заранее!