我需要(或者更好的是,我有机会)重构一些代码以使其更清洁。如何在C++中使用模板重构方法
我想使用一些模板,因为我认为这是一个很好的选择,为了减少代码重复。
这里是我的HPP
class Monetary
{
public:
Monetary();
Monetary(const rapidjson::Value& iMonetary);
virtual ~Monetary();
[...cut...]
private:
static void initMember(const rapidjson::Value& iMonetary, const char* iName, int& oMember);
static void initMember(const rapidjson::Value& iMonetary, const char* iName, std::string& oMember);
private:
int _amount;
int _decimal_place;
std::string _currency;
std::string _type;
};
这里是对的initMember方法实现:
static void Monetary::initMember(const rapidjson::Value& iMonetary, const char* iName, int& oMember)
{
rapidjson::Value::ConstMemberIterator aIterator;
aIterator = iMonetary.FindMember(iName);
if (aIterator != iMonetary.MemberEnd() &&
aIterator->value.IsNumber())
{
oMember = iMonetary[iName].GetInt();
}
}
static void Monetary::initMember(const rapidjson::Value& iMonetary, const char* iName, std::string& oMember)
{
rapidjson::Value::ConstMemberIterator aIterator;
aIterator = iMonetary.FindMember(iName);
if (aIterator != iMonetary.MemberEnd() &&
aIterator->value.IsNumber())
{
oMember = iMonetary[iName].GetString();
}
}
我在想写的东西像
template<typename T>
void Monetary::initMember(const rapidjson::Value& iMonetary, const char* iName, T& oMember)
{
rapidjson::Value::ConstMemberIterator aIterator;
aIterator = iMonetary.FindMember(iName);
if (aIterator == iMonetary.MemberEnd())
{
return;
//throw monetaryException
}
assignFromValue(iMonetary[iName], oMember);
}
template<>
void Monetary::assignFromValue<int>(const rapidjson::Value& iValue, int& oMember)
{
if (!iValue.IsNumber())
{
return;
//throw monetaryException
}
oMember = iValue.GetInt();
}
template<>
void Monetary::assignFromValue<std::string>(const rapidjson::Value& iValue, std::string& oMember)
{
if (!iValue.IsString())
{
return;
//throw monetaryException
}
oMember = iValue.GetString();
}
是有没有任何方法可以做到这一点?
当然!我真的忽视了它! 'assignFromValue'的模板根本不需要.. – btbbass
试过了一下,我非常喜欢这个方法。开始重构类之外的移动方法,这可能是一个好方法(我真的讨厌凌乱的类)! – btbbass