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 */
}