[英]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.