類型是靜態的,在代碼編譯時確定,因此根據運行時值不能有不同的返回類型。一個函數只能返回一個類型。
一種選擇是使用歧視聯盟;您想要支持的不同類型的聯合,以及枚舉值以指示哪種類型處於活動狀態。如果您想要支持常規類的類型,實現起來相當棘手,因此您可能需要查看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
}
使用'union'類型。 – Barmar 2014-10-28 16:31:58
你爲什麼想要這樣? – OmnipotentEntity 2014-10-28 16:32:35
函數參數是編譯時常量表達式嗎? – 2014-10-28 16:34:42