Итак, я изучаю C ++ и столкнулся с чем-то, что я знаю, как делать в Java, но не в C ++:).
У меня есть шаблон для объекта-контейнера, который определяется следующим образом:
template <class T>
class Container {
vector<T> contained;
public:
void add(T givenObject) {
this->contained.push_back(givenObject);
}
T get(string givenIdentifier) throw (exception) {
for (int i = 0; i < this->contained.size(); i++) {
if (this->contained[i].getIdentifier() == givenIdentifier) {
return this->contained[i];
}
}
throw new exception("An error has occured which has caused the object you requested to not be found. Please report this bug.");
}
bool empty() {
return this->contained.empty();
}
bool identifierExists(string givenIdentifier) {
for (int i = 0; i < this->contained.size(); i++) {
if (this->contained[i].getIdentifier() == givenIdentifier) {
return true;
}
}
return false;
}
};
Это на самом деле работает очень хорошо, с одной маленькой проблемой. Он сводится к двум строкам: первая - это определение шаблона, а вторая -
this->contained[i].getIdentifer()
В Java при объявлении Generic (шаблона) можно определить суперкласс / интерфейс, который должны расширяться всеми членами T, чтобы не создавать ошибку. Однако я не уверен в том, как сделать это в C ++, и меня беспокоит то, что связывание реализации здесь с методом getIdentifier, который не может быть определен, является плохим дизайном.
Теперь, это не так уж сложно, если это так, это всего лишь небольшой проект, который поможет мне выучить язык, но мне нравится стараться делать все правильно. Есть ли способ сделать то, что я думаю? Я знаю, что вы можете сделать это с примитивами, например:
template <int T>
допустимо, но когда я пытаюсь использовать пользовательский класс, я получаю ошибку компилятора. Есть предложения?