[英]How to let a C++ function return different types?
看看這段代碼:
#include<iostream>
enum class DataStructure{stack,queue};
template <typename T>
T foo(DataStructure ds){
if(ds == DataStructure::stack){
return 1;
}
else if(ds == DataStructure::queue){
return 3.14F;
}
}
int main(){
std::cout<<foo(DataStructure::stack);
}
顯然它不能編譯,給出error: no matching function for call to 'foo(DataStructure)'
但是你明白我想做什么,有沒有辦法做到這一點? 基本上foo
必須根據enum
的值返回不同的 object 或基本類型。
我為這個基本問題道歉。
如果傳入的枚舉是編譯時常量,您可以將其作為模板參數傳遞,並使 function 相應地返回不同的類型。
#include<iostream>
enum class DataStructure{stack,queue};
template <DataStructure T>
auto foo(){
if constexpr (T == DataStructure::stack){
return 1;
}
else if constexpr (T == DataStructure::queue){
return 3.14F;
}
}
int main(){
std::cout<<foo<DataStructure::stack>();
}
if constexpr
需要 c++17 ,但您可以在早期版本中使用模板專業化來實現相同的目的。
嘗試std::variant 。 它可以在運行時返回不同的值。 它可能看起來像這樣。
#include <iostream>
#include <variant>
enum class DataStructure{stack,queue};
std::variant<int, double> foo(DataStructure ds){
if(ds == DataStructure::stack){
return 1;
}
else if(ds == DataStructure::queue){
return 3.14F;
}
}
// Updated version
int main(){
std::visit(
[](auto value) {
std::cout << value;
}, foo(DataStructure::stack));
}
// Version without visit
int main(){
auto value = foo(DataStructure::stack);
if (std::holds_alternative<double>(value))
{
std::cout << get<double>(value);
}
else {
std::cout << get<int>(value);
}
}
查看std::variant ,它允許您將類型安全數據附加到各種情況。
標記派送:
struct queue {};
struct stack {};
int foo(stack) { return 1; }
float foo(queue) { return 3.14f; }
int main() {
std::cout << foo(stack{}) << '\n';
std::cout << foo(queue{}) << '\n';
return 0;
}
您需要聲明 foo 的變量類型,因為您使用的是模板,這可能會解決您的問題,因為您的 function 返回的雙精度:
std::cout << foo<double> (DataStructure::stack);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.