C++ 打印地图时出错-如何从std:any有效创建std::shared\u ptr?
这里创建了一个基类。3个子类由此创建。这些子类将采用变量类型的参数。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"; }
据我所知,当参数为空时调用工厂的第一个参数,当传递某些参数时调用第二个参数。
定义了工厂的两种添加和创建方法。
如何打印地图“选择器”的元素?这简化了如何从
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
工厂添加函数的方法。因此选择器值不太可能是也可打印。出现错误的原因:与“运算符”不匹配