繁体   English   中英

如何让 C++ function 返回不同的类型?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM