2013-05-11 2 views
4

다음 코드 스 니펫은 게임입니다. 컴파일러는 반환 값에 대해 불평하고 있습니다. 그래서이 트릭을 사용하여 함수가 두 가지 유형을 넣는 방법에 대한 피드백을 받고 싶습니다.복수형 반환

return stringOutput ? "never" : sObjectMgr->FindCreature(Guid)->GetCreatureData()->spawntimesecs; 

?: 오퍼레이터가 expressio는하지만 에러 error C2059: syntax error : 'return' 대하여

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(); 
} 
+1

무엇이 오류입니까? –

+0

오류 C2059 : 구문 오류 : 'return' – user2373581

+0

컴파일러가 옳은 것처럼 들리지만 잘못된 작업을하려고합니다. 당신이 정확히 무엇을 달성하려고하는지 설명을 추가 할 수 있습니까? – Elazar

답변

5

템플릿과 일반적인 동작을 정의하지만, 대한 그 동작을 재정의하려면 몇 가지 특정 유형을 사용하려면 템플릿 전문을 사용해야합니다.

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

순간에 당신의 오류의 원인은 T로 반환 유형을 정의한다는 것입니다. 그러나 T 유형이 float 인 경우 함수는 std::string을 반환하도록 논리가 설정됩니다. std::string에서 T까지 암시 적 캐스트가 없으므로 오류가 발생했을 가능성이 큽니다.

공통 코드를 반복하지 않으려면 위의 두 가지에 의해 호출되는 별도의 템플릿 함수로 그 코드를 가져올 수 있습니다.

+2

실제로 템플릿이 필요하면 답이 좋습니다. 이것이 나에게 여기있는 것처럼 보이지 않는다. – Elazar

+0

나는 Elazar에 동의합니다. 템플릿 매개 변수는 문자열 또는 부동 소수점이 반환되는지 여부를 결정하는 데에만 사용됩니다. 그러나 여전히 어떤 이유로 든 템플릿이 필요하다면 ... 자르면 잘못되었습니다. – cwin

+0

@ChriZzZ 감사합니다. 편집을 수락했습니다. – user2093113

0

과부하없이, 이것은이 특정 오류를 수정하기위한 방법 n이고 연산자의 각 인수는 표현식이어야합니다. return입니다. 표현이 아닙니다.

표현식으로 ?:은 정확히 단일 유형입니다. "never"spawntimesecs은 관련없는 유형입니다. 컴파일러는이를 처리 할 수 ​​없습니다. 이 두 값은 동일한 ?: 표현에 속하지 않습니다.

아마도 공용체를 사용할 수는 있지만 권장하지는 않습니다. 당신이 어떤 다형성 방법으로 형식 매개 변수를 사용하지 않기 때문에

더 나은 솔루션은 모든 템플릿을 사용하지 않습니다

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(); 
} 
+0

stringoutput은 흔들림 입력이 있는지 확인하는 부울입니다 .. – user2373581

+0

하지만 런타임 * 확인입니다. 그래서 그것은 컴파일 시간 타입에 영향을 줄 수 없다. – Elazar

1

C++은 강력하고 정적으로 형식화 된 컴파일 된 언어이므로 다른 유형을 반환하는 함수를 사용할 수 없습니다. 귀하는 단일 반환 유형으로 제한됩니다.

그런데 Boost의 variant 또는 Qt의 QVariant을 사용하면 여러 유형을 캡슐화 할 수 있습니다. 또는 특정 요구에 맞는 맞춤형 변형 솔루션을 구현하십시오.