需求

cpp 如何让调用的函数返回不同的类型?

解决

std::variant

可以返回 std::variant 定义的类型。

#include <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!";
    }
}

std::any

#include <any>

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

模板和多态

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;
}

函数的引用参数中使用模板

函数参数使用引用,也是一种方法

template<typename T>
void NetDataProcess::ParseNotifyResponseJson(const QByteArray line, T& data)
{
    QString id = "";
    QString value = "";

    QString jsonString = QString::fromUtf8(line);
    if (jsonString.startsWith("data: ")) {
      jsonString.remove(0, 6);
    }

    // 解析 JSON 字符串
    QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8());

    // 检查解析是否成功
    if (!doc.isNull() && doc.isObject()) {
      QJsonObject jsonObj = doc.object();

      // 获取 "id" 字段的值
      id = jsonObj["id"].toString();
      // 获取 "value" 字段的值
      value = jsonObj["value"].toString();

      // 输出结果
      qDebug() << "ID:" << id;
      qDebug() << "Value:" << value;
    } else {
      qDebug() << "Failed to parse JSON";
    }

    data = {id, value};
}

参考