我确实有一点问题,我想解决。
使用类模板,我用typeid()检查数据类型,以正确的方式处理它们。
template <typename _Ty_Id,
typename _Ty_Value>
class Attribute : public AttributeBase<_Ty_Id>
{
public:
Attribute() :
AttributeBase(_Ty_Id()),
m_tyValue(_Ty_Value())
{
}
Attribute(_Ty_Id tyId, _Ty_Value tyValue) :
AttributeBase(tyId),
m_tyValue(tyValue)
{
}
virtual ~Attribute() {};
virtual _Ty_Id getId() const {return m_tyId;}
virtual _Ty_Value getValue() const {return m_tyValue;}
virtual void toXml(iolib::Xml& xmlFile)
{
std::list<std::string> listXmlData;
std::string strTag;
if(typeid(m_tyId) == typeid(std::string))
{
strTag = m_tyId;
}
else
{
strTag = core::Stringfunc::format(strTag, m_tyId, 0, 0);
}
listXmlData.push_back(strTag);
listXmlData.push_back("entrytype");
listXmlData.push_back(m_strEntryType);
listXmlData.push_back("datatype");
listXmlData.push_back(m_strDataType);
std::string strValue;
if(typeid(m_tyValue) == typeid(std::string))
{
#pragma warning(disable : 4244)
strValue = m_tyValue;
#pragma warning(default : 4244)
}
else if((typeid(m_tyValue) == typeid(float)) ||
(typeid(m_tyValue) == typeid(double)))
{
strValue = core::Stringfunc::format(strValue, m_tyValue, 0, 3);
}
else
{
strValue = core::Stringfunc::format(strValue, m_tyValue, 0, 0);
}
listXmlData.push_back(strValue);
listXmlData.push_back("/" + strTag);
xmlFile.addElement(listXmlData);
}
private:
_Ty_Value m_tyValue;
}
模板参数是一个浮点值,将在else if分支中处理。但是,VS 2010将带来警告#4244,从float到std :: string的隐式转换可能无法正常工作。
到目前为止,我在发生这种情况时禁用了警告,一切都会好的。但是,这当然只适用于VS2012,并希望将我的代码用于不同的目标。
有谁知道更明智的方法来阻止警告?
修改
所以,现在我发布了该课程的主要部分。
问题在于方法:toXml(iolib :: xml&amp; xmlFile),将接受对我的xml类的引用。使用的类型(m_tyValue)是Attribute&lt;&gt;的成员。类。
模板参数是:m_tyId的std :: string和m_tyValue的float。
祝你好运, 海岸
答案 0 :(得分:0)
注意:您不应使用以__
(双下划线)或_
和大写字母开头的名称。这些是为C ++ Std
要为不同类型(在编译时知道类型)获取不同的行为,您可以使用类模板的(部分)特化:
template < typename Ty_Id >
struct toXmlHelper
{}; // provide no default implementation
template < >
struct toXmlHelper < double > // implementation in case Ty_Id == double
{
void toXml() { /*...*/ }
};
template < >
struct toXmlHelper < std::string > // implementation in case Ty_Id == std::string
{
void toXml() { /*...*/ }
};
您可能希望添加减少代码冗余的技术。
另一种方法是使用重载机制:
template < typename Ty_Id,
typename Ty_Value>
class Attribute : public AttributeBase<_Ty_Id>
{
public:
/* ... */
virtual void toXml(iolib::Xml& xmlFile)
{
std::list<std::string> listXmlData;
std::string strTag;
/* ... */
toXmlHelper(m_tyId);
}
private:
void toXmlHelper(double);
void toXmlHelper(std::string const&);
}
如您所知m_tyId
的类型,没有理由使用运行时类型信息。警告显示为为您的类模板的所有实例编译的代码(在每个if-clase中),即使它没有意义,例如将float指定给字符串。