C++ 打印地图时出错-如何从std:any有效创建std::shared\u ptr?

C++ 打印地图时出错-如何从std:any有效创建std::shared\u ptr?,c++,c++17,C++,C++17,这里创建了一个基类。3个子类由此创建。这些子类将采用变量类型的参数。 据我所知,当参数为空时调用工厂的第一个参数,当传递某些参数时调用第二个参数。 定义了工厂的两种添加和创建方法。 如何打印地图“选择器”的元素?这简化了如何从std:any有效创建std::shared_ptr struct Base { Base(int d) : data(d) {}; virtual ~Base() { std::cout << "Destructor Base\n"; }

这里创建了一个基类。3个子类由此创建。这些子类将采用变量类型的参数。
据我所知,当参数为空时调用工厂的第一个参数,当传递某些参数时调用第二个参数。
定义了工厂的两种添加和创建方法。
如何打印地图“选择器”的元素?这简化了如何从
std:any
有效创建
std::shared_ptr

struct Base
{
    Base(int d) : data(d) {};
    virtual ~Base() { std::cout << "Destructor Base\n"; }
    virtual void print() { std::cout << "Print Base\n"; }
    int data{};
};

struct Child1 : public Base { 
    Child1(int d, std::string s) : Base(d) { std::cout << "Constructor Child1 " << d << " " << s << "\n"; }
    virtual ~Child1() { std::cout << "Destructor Child1\n"; }
    virtual void print() { std::cout << "Print Child1: " << data << "\n"; }
};

struct Child2 : public Base {
    Child2(int d, char c, long l) : Base(d) { std::cout << "Constructor Child2 " << d << " " << c << " " << l << "\n"; }
    virtual ~Child2() { std::cout << "Destructor Child2\n"; }
    virtual void print() { std::cout << "Print Child2: " << data << "\n"; }
};
struct Child3 : public Base {
    Child3(int d, long l, char c, std::string s) : Base(d) { std::cout << "Constructor Child3 " << d << " " << l << " " << c << " " << s << "\n"; }
    virtual ~Child3() { std::cout << "Destructor Child3\n"; }
    virtual void print() { std::cout << "Print Child3: " << data << "\n"; }
};

using UPTRB = std::unique_ptr<Base>;

template <class Child, typename ...Args>
UPTRB createClass(Args...args) { return std::make_unique<Child>(args...); }

// The Factory ----------------------------------------------------------------------------------------
template <class Key, class Object>
class Factory
{
    std::map<Key, std::any> selector;
public:
    Factory() : selector() {}
    Factory(std::initializer_list<std::pair<const Key, std::any>> il) : selector(il) {}

    template<typename Function>
    void add(Key key, Function&& someFunction) { selector[key] = std::any(someFunction); };

    template <typename ... Args>
    Object create(Key key, Args ... args) {
        for(std::map<int, std::any, std::less<int>, std::allocator<std::pair<const int, std::any> > >::iterator it = selector.begin(); it!= selector.end();it++)
        {
            cout<<"1st = "<<it->first;
            cout<<"2nd = ";
            std::any_cast<std::add_pointer_t<Object(Args ...)>>(selector[key])(args...)->print();
        }

        if (selector.find(key) != selector.end()) {
            return std::any_cast<std::add_pointer_t<Object(Args ...)>>(selector[key])(args...);
        }
        else return nullptr;
    }
    void print()
    {
        for(map<int,shared_ptr<Base>>::iterator it= selector.begin();it!=selector.end();it++)
        {
            cout<<"1st = "<<it->first;
            cout<<"2nd = "<<((it->second)->data)<<endl;
        }
    }
};
struct Base
{
基(int d):数据(d){};

virtual~Base(){std::cout每个帖子一个问题。你会发现“请给我解释一下这个代码”这类问题很可能会在这里结束。好的,只是如何打印地图选择器?编辑…你说的“如何打印地图选择器”是什么意思。选择器是一个地图键->std::any。如果键的类型不可打印,则无需打印太多。此外-
void add
工厂添加函数的方法。因此选择器值不太可能是也可打印。出现
错误的原因:与“运算符”不匹配