我正在使用json使用Jsoncpp库开发一个项目。我用以下方法创建了模板类:
myValue是T型;
template <typename T>
void SerializableScalar<T>::deserialize(const Json::Value& token)
{
if (isDeserilizationPossible(token)) {
if (token.isInt())
{
myValue = token.asInt();
}
if (token.isString())
{
myValue = token.asString().c_str();
}
if (token.isDouble())
{
myValue = token.asDouble();
}
if (token.isBool())
{
myValue = token.asBool();
}
}
}
我得到了以下错误:
error C2440: '=' : cannot convert from 'const char *' to 'double'
error C2440: '=' : cannot convert from 'const char *' to 'int'
我很清楚为什么会出现这些错误,我在一种方法中混合使用更多类型。我带来了一个解决方案来重载此方法并为此类设置专门化。但有没有更清洁的解决方案?我正在寻找简单的东西。
答案 0 :(得分:0)
您需要详细说明myValue
,我认为它属于T
类型。
所有代码流(if-else块的分支)都需要是有效的代码并进行编译。即使可能永远不会执行分支也是如此。 T myValue
需要对函数中的所有返回类型有效。
您可能正在寻找使用&#34;标签调度&#34;将分配分配给自己的功能的内容。技术。经典的编译时技术在这里不起作用,它需要运行时评估的构造。一种技术可以包括as...
对象的转换成员(token
等)。
答案 1 :(得分:0)
一个简单的想法(我认为不是最好的):专注于每个可能的T值:
template <typename T>
void SerializableScalar<T>::deserialize(const Json::Value& token)
{
std::cerr << "Error: no generic deserialization" << std::endl;
}
void SerializableScalar<int>::deserialize(const Json::Value& token)
{
if (isDeserilizationPossible(token))
{
if (token.isInt())
{
myValue = token.asInt();
}
else
{
std::cerr << "Error: cannot deserialize to int" << std::endl;
}
}
}
void SerializableScalar<char *>::deserialize(const Json::Value& token)
{
if (isDeserilizationPossible(token))
{
if (token.isString())
{
myValue = token.asString().c_str();
}
else
{
std::cerr << "Error: cannot deserialize to string" << std::endl;
}
}
}
void SerializableScalar<double>::deserialize(const Json::Value& token)
{
if (isDeserilizationPossible(token))
{
if (token.isDouble())
{
myValue = token.asDouble();
}
else
{
std::cerr << "Error: cannot deserialize to double" << std::endl;
}
}
}
void SerializableScalar<bool>::deserialize(const Json::Value& token)
{
if (isDeserilizationPossible(token))
{
if (token.isBool())
{
myValue = token.asBool();
}
else
{
std::cerr << "Error: cannot deserialize to bool" << std::endl;
}
}
}