Рассмотрим класс Calendar, в котором хранится группа объектов Date.
Календарь предназначен для хранения коллекции объектов любого типа, которые наследуются от Date. Я думал, что лучший способ сделать это - иметь шаблон класса, такой как
template<typename D> class Calendar{
...
}
Но меня поразило, что теперь D действительно может быть любым классом.
Мой вопрос сейчас, как я могу убедиться, что D является подклассом объекта даты?
Я знаю, как это сделать на Java, но я все еще незнаком с синтаксисом C ++. Проблема очень похожа на то, как некоторые коллекции могут принимать только переменные шаблона, которые реализуют Comparable. Заголовок будет выглядеть примерно так:
public class Calendar<D extends Date>{
...
}
-------------------- РЕДАКТИРОВАТЬ: ------------------------- -----------------
Аргумент шаблона определяет, к какому фактическому дню относится календарь. Различные типы дат относятся к одному и тому же дню в разных форматах. Например, если я сделаю Calendar<Gregorian>
, он сможет брать даты в другом формате Date
, скажем, в юлианском календаре или любом другом формате даты, и представлять их в григорианском формате. Это позволяет для преобразования между календарями в разных форматах даты. Итак, если у меня есть Calendar<Gregorian>
, я могу легко преобразовать его в Calendar<Julian>
. Тогда возможно следующее:
Calendar<Gregorian> cal;
std::cout << "These events are entered as dates in
the Gregorian calendar" << std::endl;
cal.add_event("Christmas", 12, 25);
cal.add_event("Gregorian new year", 1, 1);
std::cout << cal << std::endl;
std::cout << "----" << std::endl;
std::cout << "And printed out as Julian dates" << std::endl;
Calendar<Julian>(cal);
std::cout << cal<< std::endl;
и выходы:
These events are entered as dates in the Gregorian calendar
2009-12-25 Christmas
2010-01-01 Gregorian new year
----
And printed out as Julian dates
2009-12-13 Christmas
2009-12-19 Gregorian new year
------------- Новое редактирование: ----------------------
Последнее редактирование теперь имеет больше смысла. У меня было небольшое несогласие с форматированием.
Спасибо за все ответы.
Я учусь на информатике на третьем курсе, и я бы сказал, что хорошо знаком с ОО и связанными с ним понятиями, такими как полиморфизм и т. Д. Цель этого поста состояла в том, чтобы выяснить, существует ли способ в C ++, чтобы выразить условие для аргумента шаблона так же, как в Java, и решить проблему кратким, элегантным и интуитивно понятным способом.