Я понимаю, как полиморфизм и обобщенные элементы взаимодействуют в других языках программирования (Java, C #, Typescript и т. Д.).Однако в C ++ это похоже на шаблон, который я хотел бы использовать с ошибками.
В этом примере я хочу получить список Name
с, который расширяет Word
с.Я хочу передать свой список имен в метод, который принимает список слов, но я не могу.Я могу заполнить список слов с моими именами, но при этом теряется информация о типе, что означает, что я не могу вызывать методы, наследуемые для класса Name.
#include <iostream>
#include <string>
#include <list>
class Word{
public:
virtual void say() = 0;
};
class Name : public Word{
std::string name;
public:
Name(std::string name){
this-> name = name;
}
void say() override{
std::cout << name << std::endl;
}
void important_name_function(){
// Something very important I want to call
}
};
void say_one(Word* w){
w-> say();
}
void say_all(std::list<Word*> list){
for(Word* w: list){
w-> say();
}
}
int main(){
std::list<Word*> words = {new Name("Kai"), new Name("Ben"), new Name("Sam")};
say_one(words.front()); //Works, due to the magic of polymorphism
say_all(words); //Works, due to the magic of polymorphism
std::list<Name*> names = {new Name("Kai"), new Name("Ben"), new Name("Sam")};
say_one(names.front()); //STILL works due to the magic of polymorphism AND type information is retained
say_all(names); //Fails but feels like it shouldn't
}
В, например,Java Я мог бы решить эту проблему, определив, скажем, все как
static <T extends Word> void say_all (java.util.LinkedList<T> list){
for(T w:list){
w.say();
}
}
Однако, поиск этого решения в C ++ дает то, что на мой взгляд выглядит как уродливое решение ( C ++ эквивалент использованиядля параметра java / тип возвращаемого значения )
Для меня это означает, что одно из следующего является верным:
- Этот шаблон по своей природе нежелателен и не должен преследоваться.
- Решение, которое я отклонил как некрасивое, на самом деле является лучшим решением и / или
- Я неправильно обращаюсь к нему как к некрасивому. Существует другое решение для создания этого шаблона