在模板类C ++

时间:2016-02-12 08:54:59

标签: c++ c++11

我正在使用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'

我很清楚为什么会出现这些错误,我在一种方法中混合使用更多类型。我带来了一个解决方案来重载此方法并为此类设置专门化。但有没有更清洁的解决方案?我正在寻找简单的东西。

2 个答案:

答案 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;
         }                 
    }
}