2012-12-16 44 views
2

可能重複:
Overloading by return type僅輸出超載C++

是否有可能過載僅一個函數的輸出。說例如我有一個函數可以以兩種不同的方式返回一個姿勢。 6DOF姿態或均勻變換矩陣。所以,我有兩個功能:

Eigen::Vector6f pose(); 

Eigen::Matrix4d pose(); 

是否確定超載的唯一輸出?

如果我這樣做,那麼編譯器將如何知道使用哪個函數?

它可以告訴當我這樣做:

Eigen::Matrix4d poseHolder = pose(); 

使用第二個功能?如果沒有,有沒有辦法做到這一點,而不是單獨命名的功能?

+4

在計算機編程中,「函數的輸出」被稱爲「函數的返回類型」。 –

回答

5

不,你不能這樣做。如果你真的堅持使用相同的名稱爲兩個不同的功能,你可以通過重載轉換運算符返回一個代理對象樣的假貨:

struct Proxy { 
    operator Eigen::Vector6f() const { 
     // ... 
    } 

    operator Eigen::Matrix4d() const { 
     // ... 
    } 
}; 

Proxy pose() { return Proxy(); } 
1

重載函數必須因簽名不同而不同。對於普通函數,返回類型不是簽名的一部分,所以你不能做你以後的事情。對於函數模板,儘管返回類型是簽名的一部分,所以您可以重載只有返回類型不同的函數模板。

規則是合乎邏輯的。事實上,對於普通函數,編譯器(在一般情況下)不知道要調用哪個函數。在函數模板的情況下,調用者可以自由地明確指定返回類型。

1

到函數重載的關鍵是一個函數的參數列表,也被稱爲函數簽名

如果兩個函數以相同的順序使用相同數量和類型的參數,它們具有相同的簽名;變量名稱無關緊要。通過C++,您可以使用相同名稱定義兩個函數,前提是函數具有不同的簽名。

簽名可以在參數數目或參數類型或兩者上有所不同。

拿你的樣品,如果你只是不想'存儲返回值pose();那麼應該調用哪一個?

pose();