提升任何用途

时间:2010-06-17 14:47:55

标签: c++ boost map insert boost-any

如何从boost中将自己的类对象插入到ptr_map中。对象是模板化的,所以我不能在地图中使用一些静态类型名称。所以我做了:

ptr_map<string, any> someMap;

我的班级继承了 boost :: noncopyable

someMap.insert("Test", new MyClass<SomeTemplate>());

错误是:错误:no matching function for call to ‘boost::ptr_map


UPD : 我更喜欢做一些包装,不要使用boost :: any。所以:

class IWrapper { };
class MyClass : public IWrapper { };

ptr_map<string, IWrapper> someMap;
someMap.insert("Test", new MyClass<SomeTemplate>());

为什么它不起作用(同样的错误)?我可以将继承的类传递给父接口。怎么了?

2 个答案:

答案 0 :(得分:3)

到目前为止,大多数时候这类问题都应该用一个共同的基类来解决。当类似地使用所有类时就是这种情况。运行时多态性。

我已经看到了不允许共同基类的正当理由。在这种情况下,boost::variant通常会更好地服务,因为仍有方法统一处理每个项目(访问者)。编译时间多态性。

我从未见过合法使用boost::any。我不是说没有一个,但是我从来没有遇到过这么罕见。


那说,试试这个。

std::map<std::string,boost::any> someMap;
boost::any insanity = new MyClass<SomeTemplate>;
someMap.insert("Test",insanity);

boost::ptr_map<std::string,boost::any> someMap;
boost::any* ive_lost_it = new boost::any( new MyClass<SomeTemplate> );
someMap.insert("Test", ive_lost_it );

答案 1 :(得分:1)

首先,你必须为你的ptr_map提供任何* 然后密钥必须是左值(由于异常安全问题)。

boost::ptr_map<std::string, any> someMap;
any * p = new any(MyClass<Sometype>);
std::string test = "test";
someMap.insert(test, p);

- 编辑
如果您使用包装类,则相同。密钥必须是左值。

顺便说一下,这里的包装器/基类的问题是你将无法恢复原始类型(并且由于模板类型,你没有动态多态性)。