gpt4 book ai didi

c++ - 编译错误,对成员变量进行多重赋值的方法,模板类 C++

转载 作者:行者123 更新时间:2023-11-28 02:11:45 25 4
gpt4 key购买 nike

问题方法:

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'

最佳答案

不幸的是,没有办法为每个相关类型创建专门化。这是将特化委托(delegate)给辅助类的一种方法:

template<typename T>
struct Helper
{
static inline bool is(const Json::Value&);
static inline T as(const Json::Value&);
};

template<> bool Helper<int>::is(const Json::Value& tok)
{ return tok.isInt(); }

template<> bool Helper<double>::is(const Json::Value& tok)
{ return tok.isDouble(); }

template<> bool Helper<string>::is(const Json::Value& tok)
{ return tok.isString(); }

template<> bool Helper<bool>::is(const Json::Value& tok)
{ return tok.isBool(); }

template<> int Helper<int>::as(const Json::Value& tok)
{ return tok.asInt(); }

template<> double Helper<double>::as(const Json::Value& tok)
{ return tok.asDouble(); }

template<> string Helper<string>::as(const Json::Value& tok)
{ return tok.asString(); }

template<> bool Helper<bool>::as(const Json::Value& tok)
{ return tok.asBool(); }

template<typename T>
void SerializableScalar<T>::deserialize(Json::Value& tok)
{
if ( Helper<T>::is(tok) )
myValue = Helper<T>::as(tok);
}

关于c++ - 编译错误,对成员变量进行多重赋值的方法,模板类 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35449743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com