Мне нужна переменная std::map
, которая принимает ключ std::string
и значение любого типа:
template <typename T>
std::map<std::string, T> general;
general<A>["a"] = new A;
general<B>["b"] = new B;
general<C>["c"] = new C;
Но я не хочу указывать переменную шаблона каждый раз, когда я ее использовал, поэтому я написал это:
class general_one
{
public:
general_one& operator[](const char* key)
{
m_current_key = key;
return *this;
}
template <typename T>
void operator=(T&& block)
{
m_blocks<T>[m_current_key] = std::forward<T>(block);
}
private:
template <typename T>
static inline std::map<std::string, T> m_blocks;
std::string m_current_key;
};
И теперь я могу использовать его как хочу:
general_one general;
general["a"] = new A;
general["b"] = new B;
general["c"] = new C;
Но все же в реализации функции-члена at()
я должен указать переменную шаблона:
template <typename T>
T& at(const char* key)
{
return m_blocks<T>[key];
}
general_one a;
a["ghasem"] = new int(12);
a["another"] = new double(.32);
a["again_another"] = new float(.34f);
std::clog << *a.at<int*>("ghasem") << std::endl;
Есть ли способ избежать требования указывать тип в функции-члене at()
?