你知道C++如何在一個函式內返回不同型別嗎?

架構師老盧發表於2023-12-01

C++ 中要在一個函式內返回不同型別的值,你可以使用 C++17 引入的 std::variant 或 std::any,或者使用模板和多型。下面將分別介紹這些方法。

方法一:使用 std::variant

std::variant 允許你在一個函式內返回不同型別的值,但它要求所有可能的返回型別都在一個有限的集合中,你需要提前定義這個集合。

首先,包括 <variant> 標頭檔案:

#include <variant>

然後,使用 std::variant 來定義函式的返回型別:

std::variant<int, double, std::string> GetDifferentValue(int choice) {
    if (choice == 0) {
        return 42;
    } else if (choice == 1) {
        return 3.14;
    } else {
        return "Hello, World!";
    }
}

在這個示例中,GetDifferentValue 函式可以返回 int、double 或 std::string,具體返回哪種型別取決於 choice 引數的值。

方法二:使用 std::any

std::any 允許你在一個函式內返回不同型別的值,而無需提前定義可能的返回型別。但在使用 std::any 時,你需要小心型別安全和型別轉換。

首先,包括 <any> 標頭檔案:

#include <any>

然後,使用 std::any 來定義函式的返回型別:

std::any GetDifferentValue(int choice) {
    if (choice == 0) {
        return 42;
    } else if (choice == 1) {
        return 3.14;
    } else {
        return "Hello, World!";
    }
}

在這個示例中,GetDifferentValue 函式可以返回任何型別的值。

方法三:使用模板和多型

另一種方式是使用模板和多型,這樣你可以在執行時動態確定返回的型別。這通常需要建立一個基類,派生出具體型別的子類,並使用基類指標或智慧指標進行返回。

#include <iostream>
#include <memory>

class Base {
public:
    virtual void print() const = 0;
};

class IntType : public Base {
public:
    IntType(int value) : value(value) {}
    void print() const override {
        std::cout << "Int: " << value << std::endl;
    }

private:
    int value;
};

class DoubleType : public Base {
public:
    DoubleType(double value) : value(value) {}
    void print() const override {
        std::cout << "Double: " << value << std::endl;
    }

private:
    double value;
};

class StringType : public Base {
public:
    StringType(const std::string& value) : value(value) {}
    void print() const override {
        std::cout << "String: " << value << std::endl;
    }

private:
    std::string value;
};

std::unique_ptr<Base> GetDifferentValue(int choice) {
    if (choice == 0) {
        return std::make_unique<IntType>(42);
    } else if (choice == 1) {
        return std::make_unique<DoubleType>(3.14);
    } else {
        return std::make_unique<StringType>("Hello, World!");
    }
}

int main() {
    auto value = GetDifferentValue(2);
    value->print();
    return 0;
}

在這個示例中,GetDifferentValue 返回一個指向 Base 基類的智慧指標,而 Base 有多個派生類,代表不同的返回型別。

以上是三種在 C++ 中返回不同型別的方法,你可以根據具體需求選擇其中之一。

相關文章