【发布时间】:2012-09-26 16:16:20
【问题描述】:
大家!
我有一个名为 UpdateValue 的模板函数,它旨在更新一些不同类型的值,例如整数、BOOL、字符串等。请参考以下代码sn-p:
#include <typeinfo.h>
template<class T>
void UpdateValue(T Value)
{
if ( typeid(int) == typeid(Value) )
{
ZOrder(Value);
}
else if ( typeid(bool) == typeid(Value) )
{
BOOL bShow = Value ? TRUE : FALSE;
Show(bShow);
}
else if ( typeid(CString) == typeid(Value) )
{
Theme(Value);
}
}
void Show(BOOL bShow) { m_bShow = bShow; }
void ZOrder(int nZOrder) { m_nZOrder = nZOrder; }
void Theme(CString strTheme) { m_strTheme = strTheme; }
BOOL m_bShow;
int m_nZOrder;
CString m_strTheme;
但是当我使用下面的语句来调用这种模板函数时
CString strValue = _T("Animal");
UpdateValue<CString>(strValue);
上述代码编译失败,抛出以下异常:
e:\dynaprop\dynaprop\mainfrm.cpp(269) : 错误 C2664: 'CMainFrame::ZOrder' : 无法将参数 1 从 'CString' 转换为 'int' 1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符 1> e:\dynaprop\dynaprop\mainfrm.cpp(67) : 请参阅正在编译的函数模板实例化 'void CMainFrame::UpdateValue(T)' 的参考 1> 与 1> [ 1> T=C字符串 1>]
你能告诉我怎么解决吗?提前谢谢!
【问题讨论】:
-
当
Value是CString而ZOrder是int时,您调用ZOrder(Value)。 -
谢谢chris。typeid不是在模板函数中生效吗?当我使用 UpdateValue
("Animal") 通过调用 Theme 函数修改字符串时,我想使用“if ... then”条件块以及 typeid 来防止调用 ZOrder 和 Show 函数。 -
你可能想研究模板专业化。
-
@GoldenLee,
typeid是运行时操作,以及基于if的代码。编译器解析每个运行时方面,因此只有编译时比较才能阻止它查看该调用。模板专业化很可能是您想要的。 -
@chris:谢谢。我在理解 typeid 的运行时机制时犯了一个错误。我可能会使用重载函数来解决我的问题。