【发布时间】:2016-02-17 06:48:26
【问题描述】:
问题方法:
template <typename T>
void SerializableScalar<T>::deserialize(const Json::Value& token)
{
if (isDeserilizationPossible(token)){
if (token.isInt())
{
myValue = token.asInt();
}
if (token.isDouble())
{
myValue = token.asDouble();
}
if (token.isString())
{
myValue = token.asString().c_str();
}
if (token.isBool())
{
myValue = token.asBool();
}
}
}
其中 token 可以保存类型 string、int、double、bool。
然后我创建对象并使用反序列化方法
Json::Value token(55);
当我创建对象时:
SerializableScalar<int> object;
object.deserialize(token);
我得到编译错误,因为当我创建 T = int; 的对象时在我的反序列化方法中,即使 json 不包含 string 的值,我也无法将 string 转换为 int ,因此编译器会检查所有分支....现在我向您征求意见。有什么解决办法吗?我试图重载反序列化方法,它可以工作,但我不想要单独的 4 个方法,我正在寻找更清洁的方法。
IsDeserilizationPossible 方法
template <typename T>
bool SerializableScalar<T>::isDeserilizationPossible(const Json::Value& token)
{
if (!token.isArray() && !token.isObject() && !token.empty())
{
myIsDeserialize = true;
return true;
}
throw std::exception("Some exception");
}
其他信息:
在cLass中只是空的构造函数和变量myValue持有T的类型。点是反序列化Json,设置类型T的值。客户端知道他想要获取的类型,所以他使用getMethod获取Serializable对象的值;就是这样,我尝试了专业化,它已经很好了,但我只是好奇是否还有更多我可以使用的东西,所以我不需要重载方法。
错误::
error C2440: '=' : cannot convert from 'const char *' to 'double'
error C2440: '=' : cannot convert from 'const char *' to 'int'
【问题讨论】:
-
如果您包含编译器错误以及可能对 SerializableScalar 进一步的类定义,将会很有帮助。
myValue是什么? -
已更新,包括错误
-
真的没有办法。您将不得不为您关心的每个
T编写模板专业化。但是,您可以专门针对类型的“组”。请在此处查看我的答案以供参考:stackoverflow.com/a/34111729/1142167 -
基本上,没有办法确保在编译时你的 if 语句的任何分支都会在运行时被遍历。这就是你的编译器阻塞的原因。例如,它无法提前知道
token.isInt()是否会仅针对ints 返回true。
标签: c++ c++11 visual-c++ c++14