- 论坛徽章:
- 0
|
自己简化了一下Any:
class Any {
public:
Any() : content(0){}
template<typename ValType>
Any(const ValType & value) : content(new holder<ValType>(value)){}
Any(const Any & other) : content(other.content ? other.content->clone() : 0){}
~Any(){delete content;}
public:
template<typename ValType>
Any & operator=(const ValType & rhs){
Any(rhs).swap(*this); return *this;
}
bool empty() const{return !content;}
const std::type_info & type() const {
return content ? content->type() : typeid(void);
}
private:
Any & swap(Any & rhs){
std::swap(content, rhs.content);
return *this;
}
private:
class placeholder{
public:
virtual ~placeholder(){}
virtual const std::type_info & type() const = 0;
virtual placeholder * clone() const = 0;
};
template<typename ValType>
class holder : public placeholder{
public:
holder(const ValType & value) : held(value){}
public:
virtual const std::type_info & type() const {return typeid(ValType);}
virtual placeholder * clone() const {return new holder(held);}
public:
ValType held;
};
private:
template<typename ValType>
friend ValType * any_cast(Any *);
placeholder * content;
};
template<typename ValType>
inline ValType * any_cast(Any * any){
return any && any->type() == typeid(ValType)?
&static_cast<Any::holder<ValType> *>(any->content)->held : 0;
}
template<typename ValType>
ValType any_cast(const Any &any){
ValType * val = any_cast<ValType>(&any);
if(val == 0) throw "invalid type-casting";
return *val;
}
之后想用于map<string,Any>,往里存取double等简单类型无误,例如:
mp["ddd"]= val;
但放入类就有问题,例如:
class A
{
public:
enum ATYPE{AT_X,AT_Y};
virtual ATYPE getType() = 0;
};
class X:public A
{
public:
ATYPE getType(){return AT_X;};
void print();
public:
string x1;
double x2;
};
一样:mp["XXX"] = val;注意这里可以用type()取类型。
取的时候:
std::map<std::string,Any>::iterator it(mp.find(key));
if(it == mp.end()) return Any(std::string(""));
return it->second;
到it->second返回时就segment fault。在这里想用type()取类型也一样segment fault,不知错在哪儿。 |
|