簡體   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