Как получить доступ к элементам в переменной шаблона std :: map без указания переменной шаблона? - PullRequest
0 голосов
/ 09 июля 2020

Мне нужна переменная 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()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...