Я использую Google Protobuf и хочу использовать созданные классы в «базовом» классе.Я создал для этого шаблон, но я хочу добавить в него ссылки на другие классы (которые могут быть ссылками на 1 класс или несколько классов).Пример:
template<typename T>
class SomeClass
{
public:
std::shared_ptr<T> get(int id)
{
// Of course this contains more checks, but that is not important for the example.
items.find(id).second();
}
void add (std::shared_ptr<T> item)
{
items.emplace(item.id(), item)
}
private:
std::map<int, T> items;
}
Это работает нормально.Но теперь я хочу добавить карту, вектор или whtvr с элементами SomeClass, но T здесь каждый раз отличается.Поэтому я хочу иметь возможность:
SomeClass<Person> person;
SomeClass<Animal> animal;
SomeClass<Plant> plant;
person.add(animal);
person.add(plant);
Функция добавления должна выглядеть примерно так:
private:
std::vector<SomeClass<???>> someContainer;
public:
void add(SomeClass<???> item)
{
someContainer.push_back(item);
}
Может быть, полезно знать: T - это google protobuf Message.
Я попытался добавить класс, из которого происходит SomeClass.Однако, когда вы хотите выполнить 'get', вам также нужно иметь T для базового класса.А потом все начинается снова.
Есть ли способ сделать это?