2014-10-28 74 views
-2

我有一個函數,應該返回類A的對象,如果我是積極的,返回一個整數其他。 這是一個非常簡單的例子,我不能使用重載!C++:兩種類型的return |模板

#include <iostream> 

template <typename T> 
T& function(int i){ 
    T res; 
    if (i>0){ 
     A res = 1; 
    } 
    else{ 
     int res = 5; 
    } 
    return res; 
} 


int main(){ 
    A res1 = function(5); 
    int res2 = function(-5;) 
    return 0; 
} 
+0

使用'union'類型。 – Barmar 2014-10-28 16:31:58

+0

你爲什麼想要這樣? – OmnipotentEntity 2014-10-28 16:32:35

+0

函數參數是編譯時常量表達式嗎? – 2014-10-28 16:34:42

回答

2

類型是靜態的,在代碼編譯時確定,因此根據運行時值不能有不同的返回類型。一個函數只能返回一個類型。

一種選擇是使用歧視聯盟;您想要支持的不同類型的聯合,以及枚舉值以指示哪種類型處於活動狀態。如果您想要支持常規類的類型,實現起來相當棘手,因此您可能需要查看Boost的Variant庫。例如:

boost::variant<int,T> function(int i) { 
    if (i>0) 
     return A{1}; 
    else 
     return int{5}; 
} 

int main() { 
    A res1 = boost::get<A>(function(5)); 
    int res2 = boost::get<int>(funtion(-5); 
} 

另一種選擇可能是提供了一套針對不同類型的回調函數,並辦理值存在而不是返回它。例如:

template <typename Callback> 
void function(int i, Callback & callback) 
    if (i>0) 
     callback(A{1}); 
    else 
     callback(int{5}); 
} 

struct MyCallback { 
    void operator()(A const &) {/* do something with A */} 
    void operator()(int)  {/* do something with int */} 
}; 

int main() { 
    MyCallback callback; 
    function(5, callback); // calls callback for A 
    function(-5, callback); // calls callback for int 
} 
0

你想做的事情是不可能的。你的函數只能有一個返回類型。你可以通過引用傳遞一個A變量和一個整型變量,並通過函數設置一個或另一個變量,但這是你能夠獲得的最接近的變量。我很不確定你想要完成什麼。

+0

實際上並非不可能。只是很困難,需要一些額外的工作。我也想知道他究竟在做什麼。因爲這聽起來像是一個簡單問題的不好解決方案。 – OmnipotentEntity 2014-10-28 16:39:40

+0

@OmnipotentEntity現在只是在猜測,但也可能是OP用於「動態類型」語言,例如, LUA這種事情是微不足道的。 – dgnuff 2014-10-28 16:46:39

+0

@OmnipotentEntity - 我不明白除了返回一個包裝對象或類似的東西之外它是如何可能的,我不知道我是否真的認爲這是一個變量返回類型。除非有另一種方式? – Matt 2014-10-28 17:50:11

0

C++根本不支持這一點。

一個更好的解決辦法是:

bool function(int i, int &intResult, A &AResult) 
{ 
    if (i > 0) 
    { 
     AResult = A(1); 
     // Or whatever other code you need to place the result in AResult 
     return true; 
    } 
    intResult = 5; 
    return false; 
} 

您需要同時通過一個int和一個接收可能的返回值,並通過檢查該所返回你知道哪一個是填充在布爾