我有一个pd :: map的Poco :: Any我正在尝试迭代并输出到流但是我收到编译错误。我的代码如下:
map<string, Poco::Any>::const_iterator it;
map<string, Poco::Any>::const_iterator end = _map.end();
map<string, Poco::Any>::const_iterator begin = _map.begin();
for(it = begin; it != end; ++it) {
const std::type_info &type = it->second.type();
// compile error here:
os << " " << it->first << " : " << Poco::RefAnyCast<type>(it->second) << endl;
}
该行有2个错误:
'type' cannot appear in a constant-expression
no matching function for call to 'RefAnyCast(Poco::Any&)'
更新
我理解模板是编译时间而type()是运行时因此不起作用。谢谢你强调这一点。此外,DynamicAny将无法工作,因为它只接受具有DynamicAnyHolder实现的类型,并不理想。我想对这些类型施加的唯一规则是它们具有&lt;&lt;超载。
以下是我目前正在做的事情,在某种程度上有效,但只转储已知的类型,这不是我所追求的。
string toJson() const {
ostringstream os;
os << endl << "{" << endl;
map<string, Poco::Any>::const_iterator end = _map.end();
map<string, Poco::Any>::const_iterator begin = _map.begin();
for(map<string, Poco::Any>::const_iterator it = begin; it != end; ++it) {
const std::type_info &type = it->second.type();
os << " " << it->first << " : ";
// ugly, is there a better way?
if(type == typeid(int)) os << Poco::RefAnyCast<int>(it->second);
else if(type == typeid(float)) os << Poco::RefAnyCast<float>(it->second);
else if(type == typeid(char)) os << Poco::RefAnyCast<char>(it->second);
else if(type == typeid(string)) os << Poco::RefAnyCast<string>(it->second);
else if(type == typeid(ofPoint)) os << Poco::RefAnyCast<ofPoint>(it->second);
else if(type == typeid(ofVec2f)) os << Poco::RefAnyCast<ofVec2f>(it->second);
else if(type == typeid(ofVec3f)) os << Poco::RefAnyCast<ofVec3f>(it->second);
//else if(type == typeid(ofDictionary)) os << Poco::RefAnyCast<ofDictionary>(it->second);
else os << "unknown type";
os << endl;
}
os<< "}" << endl;
return os.str();
}
答案 0 :(得分:7)
运行时类型信息不能用于实例化模板。 type_info
的一个实例,其值仅在运行程序时才会知道,当编译器为时,它不会神奇地变成类似int
,std::string
或struct FooBar
的类型编译此代码。
我不知道Poco库,但也许您可以使用其他任何类型的DynamicAny(请参阅documentation),这有望允许您将存储的值转换为std::string
以进行输出:< / p>
os << " " << it->first << " : " << it->second.convert<std::string>() << endl;