gpt4 book ai didi

c++ - 如何使用模板函数设置不同类型的值?

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

大家好!

我有一个名为 UpdateValue 的模板函数,它旨在更新一些不同类型的值,例如整数、 bool 值、字符串等。请参阅以下代码片段供您引用:

#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) : error C2664: 'CMainFrame::ZOrder' : cannot convert parameter 1 from 'CString' to 'int' 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 1> e:\dynaprop\dynaprop\mainfrm.cpp(67) : see reference to function template instantiation 'void CMainFrame::UpdateValue(T)' being compiled 1> with 1> [ 1> T=CString 1> ]

你能告诉我如何解决这个问题吗?提前致谢!

最佳答案

您并没有真正使用模板工具。或者更确切地说怀念使用它。发生了什么是你调用ZOrder(Value) void UpdateValue(T Value)在每次出现 T 的地方实例化被替换为 CString正如您指定的那样。但仅此而已。

函数是这样的

void UpdateValue(CString 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);
}
}

在模板被实例化后,正常的编译工作发生了……你得到一个错误,因为它被写成ZOrder(Value);其中 value属于 CString类型。这将产生错误,即使在这种情况下使用 RTTI 也永远不会到达此调用路径。

你应该做的是使用专门化来处理不同的类型。尝试替换 UpdateValue 的原始定义有了这些:

template<> // specialization when T is get to be int
void UpdateValue<int>(int Value) { ZOrder(Value);};

template<> // specialization when T is get to be CString
void UpdateValue<bool>(bool Value) { BOOL bShow = Value ? TRUE : FALSE; Show(bShow);};

template<> // specialization when T is get to be CString
void UpdateValue<CString>(CString Value) { Theme(Value);};

template<class T> //general case
void UpdateValue(T Value) { cout << "IMPLEMENT ME\n";};

然后当你调用UpdateValue< T >您使用适当的主体调用版本。您也不必使用 RTTI。

更新:在评论者建议之后。如果您不需要/不想处理一般情况(即未知类型),您可以求助于普通重载并使用:

//Value is int
void UpdateValue(int Value) { ZOrder(Value);};
//Value is bool
void UpdateValue(bool Value) { BOOL bShow = Value ? TRUE : FALSE; Show(bShow);};
//Value is CString
void UpdateValue(CString Value){ Theme(Value);};

那时甚至不需要模板!

关于c++ - 如何使用模板函数设置不同类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606090/

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