调用存储在std :: any中的对象的成员函数

问题描述

假设我有一个模板化的类,就像这样:

template<class T,class V>
class MyClass
{
    public:
    MyClass(std::string const& name){
        s = name;
    }

    T return_var1() {
        return var1;
    }

    std::string s;
    T var1;
    V var2;
};

我将按如下所示使用它:

class AnotherClass {
    public:

    void some_func() {
        MyClass<int,double> my_var("test");
        std::pair<std::string,std::any> tmp_pair("test",my_var);
        my_vars.insert(tmp_pair);
    }

    void some_other_func() {
        auto tmp = my_vars["test"];
        
        // Any way to call member function without using std::any_cast<...> ?
        // For example,not like this:
        // (std::any_cast<MyClass<int,double>>tmp).return_var1()
        // But like this:
        std::cout << tmp.return_var1();
    }

    private:
    std::unordered_map<std::string,std::any> my_vars;
}

是否可以在不知道或不使用所包含对象的类型的情况下调用存储在std :: any中的对象的成员函数? (不使用上面评论中写的std :: any_cast ()

任何解决方案都是可以接受的,例如使用std::variant等从具有CRTP的基类继承MyClass。

我需要这个的原因是因为我想这样使用模板化函数

some_templated_function<decltype(my_var.var1)>();

// Or similarly,some_templated_function<decltype(my_var.return_var1())>();

目的是允许用户注册一次<int,double>类型,并在需要的地方广泛使用类型名称

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)