Вашего осветления:
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&&
перегрузку, которая устраняет эту копию тоже)
"generic manner" - шаблоны? 'void *' - это решение C. – MSalters
@MSalters: точно. Вот почему я обратился за помощью. –
По крайней мере, используйте 'boost :: any' вместо' void * '. –