Из вашего уточнения:
template <typename OB>
class A {
std::unordered_map<std::string, OB> hash;
public:
OB const& get(std::string const&) const;
void add(OB const& object, std::string const&);
};
То есть A<int>
- это класс, который хранит int
объекты по имени, а A<std::set<float>>
- это класс, который хранит наборы чисел с плавающей точкой по имени. Вы не можете смешивать их. Это соответствует базовой философии C ++: тип theA.get("foo")
определяется во время компиляции, а не тем, что вы вводите во время выполнения.
В C ++ вы можете, однако, «смешать» несколько производных типов, если вам это понадобится в вашем конкретном случае. Это немного сложнее:
template <typename Base>
class A {
std::unordered_map<std::string, std::unique_ptr<Base>> hash;
public:
Base const& get(std::string const&) const;
template<typename Derived> void add(std::string const& name, Derived const& object)
{
std::unique_ptr<Base> copy(new Derived(object));
hash.emplace(std::make_pair(name, std::move(copy)));
}
};
Здесь есть небольшая хитрость, поскольку hash
должен быть единственным владельцем копии, но она построена снаружи и поэтому должна быть перемещена. (Для особой фантазии я мог бы добавить перегрузку Derived&&
, которая также устраняет эту копию)