C++ 返回多个类型
下面的代码片段是一个游戏的代码片段,编译器正在抱怨返回值,因此我想了解一些关于如何执行此技巧的反馈,以使函数根据输入的类型返回两个不同的类型,但不重载C++ 返回多个类型,c++,feedback,C++,Feedback,下面的代码片段是一个游戏的代码片段,编译器正在抱怨返回值,因此我想了解一些关于如何执行此技巧的反馈,以使函数根据输入的类型返回两个不同的类型,但不重载 template <typename T> T GetTimeDead(uint64 Guid) { bool stringOutput; if(typeid(T) == typeid(float)) stringOutput = false; else stringOutput
template <typename T>
T GetTimeDead(uint64 Guid)
{
bool stringOutput;
if(typeid(T) == typeid(float))
stringOutput = false;
else
stringOutput = true;
bool found = false;
for(map<uint32, TrackInfo>::iterator itr = dieTracker.begin(); itr != dieTracker.end(); ++itr)
{
if(itr->second.GUID == Guid)
{
found = true;
break;
}
}
if(!found)
stringOutput ? return "never" : return sObjectMgr->FindCreature(Guid)->GetCreatureData()->spawntimesecs;
if(!stringOutput)
return dieTracker.find(Guid)->second.seconds;
float seconds = dieTracker.find(Guid)->second.seconds;
uint64 secs = seconds % 60;
uint64 minutes = seconds % 3600 / 60;
uint64 hours = seconds % 86400 / 3600;
uint64 days = seconds / 86400;
ostringstream ss;
if(days)
days != 1 ? ss << days << " Days " : ss << days << " Day ";
if(hours)
hours != 1 ? ss << hours << " Hours" : ss << hours << " Hour";
if(minutes)
minutes != 1 ? ss << minutes << " Minutes " : ss << minutes << " Minutes ";
if(secs || (!days && !hours && !minutes))
secs != 1 ? ss << secs << " Seconds " : ss << secs << " Second ";
ss << "ago";
return ss.str();
}
模板
T GetTimeDead(uint64 Guid)
{
布尔输出;
if(typeid(T)=typeid(float))
stringOutput=false;
其他的
stringOutput=true;
bool-found=false;
for(map::iterator itr=dieTracker.begin();itr!=dieTracker.end();++itr)
{
如果(itr->second.GUID==GUID)
{
发现=真;
打破
}
}
如果(!找到)
stringOutput?返回“从不”:返回sObjectMgr->FindCreature(Guid)->GetCreatureData()->spawntimesecs;
如果(!stringOutput)
返回dieTracker.find(Guid)->second.seconds;
float seconds=dieTracker.find(Guid)->second.seconds;
uint64秒=秒%60;
uint64分=秒%3600/60;
uint64小时=秒%86400/3600;
uint64天=秒/86400;
ostringstream ss;
如果(天)
天!=1?ss关于错误错误C2059:语法错误:“return”
,这是修复此特定错误的方法:
?:
运算符是一个表达式,运算符的每个参数都应该是一个表达式。return
是一个语句,而不是表达式
作为表达式,:
具有完全单一类型。但是“从不”
和spawtimeecs
是不相关的类型。编译器无法处理。这两个值不属于同一个?:
表达式
您可能可以使用联合,但不建议使用联合
更好的解决方案根本不使用模板,因为您不以任何多态方式使用类型参数:
float GetTimeDeadFloat(uint64 Guid)
{
return find(Guid)
? dieTracker.find(Guid)->second.seconds
: sObjectMgr->FindCreature(Guid)->GetCreatureData()->spawntimesecs;
}
string GetTimeDeadString(uint64 Guid)
{
return find(Guid)
? timeToString(dieTracker.find(Guid)->second.seconds)
: "never";
}
bool find(uint64 Guid) {
for(map<uint32, TrackInfo>::iterator itr = dieTracker.begin(); itr != dieTracker.end(); ++itr) {
if(itr->second.GUID == Guid)
return true;
}
return false;
}
string timeToString(float seconds) {
string res = timeToString(seconds % 3600 / 60, "Minutes");
res += timeToString(seconds % 86400 / 3600, "Hour");
res += timeToString(seconds / 86400, "Day");
if (secs || res.length() == 0)
res += numToString(seconds % 60, "Second");
res += "ago";
return res;
}
string numToString(uint64 num, string type) {
ostringstream ss;
if (num)
ss << num << " " << type << (num != 1) ? "s" : "" << " ";
return ss.str();
}
float-GetTimeDeadFloat(uint64 Guid)
{
返回查找(Guid)
?dieTracker.find(Guid)->second.seconds
:sObjectMgr->FindCreature(Guid)->GetCreatureData()->spawntimesecs;
}
字符串GetTimeDeadString(uint64 Guid)
{
返回查找(Guid)
?timeToString(dieTracker.find(Guid)->秒秒)
:“从不”;
}
布尔查找(uint64 Guid){
for(map::iterator itr=dieTracker.begin();itr!=dieTracker.end();++itr){
如果(itr->second.GUID==GUID)
返回true;
}
返回false;
}
字符串时间字符串(浮动秒){
string res=timeToString(秒%3600/60,“分钟”);
res+=时间字符串(秒%86400/3600,“小时”);
res+=时间字符串(秒/86400,“天”);
如果(秒| |分辨率长度()=0)
res+=数值缩放(秒数为60,“秒”);
res+=“前”;
返回res;
}
字符串numToString(uint64 num,字符串类型){
ostringstream ss;
if(num)
ss如果您想用模板定义泛型行为,但要覆盖少数特定类型的行为,则应使用模板专业化
template<typename T>
std::string GetTimeDead(uint64 Guid)
{ /* code to implement your version that returns std::string */
}
template<>
float GetTimeDead<float>(uint64 Guid)
{ /* code to implement your version that returns float */
}
模板
std::字符串GetTimeDead(uint64 Guid)
{/*用于实现返回std::string的版本的代码*/
}
模板
浮点GetTimeDead(uint64 Guid)
{/*用于实现返回浮点值的版本的代码*/
}
此时出现错误的原因是您已将返回类型定义为T
。但是您的逻辑设置为,如果T
类型为float
,则函数尝试返回std::string
。可能没有从std::string
到T
的隐式转换,因此出现错误
如果您不想重复常见代码,可以将其拉入一个单独的模板函数中,由上面两个函数调用。C++是一种强大的静态类型编译语言-您不能有一个返回不同类型的函数。您只能有一个返回类型
也就是说,您可以使用Boost的variant
或Qt的QVariant
,它们可以封装不同的类型。或者根据您的特定需要实现定制的变体解决方案。error C2059:syntax error:'return'听起来编译器是对的:您正在尝试做一件坏事。您能补充一下解释吗你想准确地完成吗?你不能让一个函数根据函数内部发生的情况返回两种不同的类型。这是不可能的,因为编译器必须为每个类型t创建一个函数,但由于它是返回类型,因此不包括在函数签名中,两个函数将具有相同的s签名,不能同时存在。这就是我试图实现的,根据输入返回不同的类型。但这是一个运行时检查。因此它不会影响编译时类型。如果您确实需要一个模板,您的答案很好。在我看来,这里似乎不是这样。我同意Elazar。模板参数是仅用于确定返回的是字符串还是浮点。但是,如果出于某种原因仍需要模板,则剪掉的模板是错误的。
template<typename T>
std::string GetTimeDead(uint64 Guid)
{ /* code to implement your version that returns std::string */
}
template<>
float GetTimeDead<float>(uint64 Guid)
{ /* code to implement your version that returns float */
}