一个函数可以返回不同类型的多个值吗?



它认为从C++函数调用中返回多个值(具有不同的类型!(会很有趣。

所以我环顾四周,可能找到了一些示例代码,但不幸的是我找不到与此主题匹配的任何内容。

我想要一个像这样的功能...

int myCoolFunction(int myParam1) {
    return 93923;
}
处理不同类型的值

以返回多种不同类型的值,例如

?whatever? myCoolFunction(int myParam1) {
    return { 5, "nice weather", 5.5, myCoolMat }
}

那么这样的事情可以使用C++(我的想法是使用特殊的 AnyType-vector,但我找不到示例代码(还是我必须继续使用这些类型的调用?(见下文(

void myCoolFunction(cv::Mat &myMat, string &str){
   // change myMat
   // change str
}

注意:因此,返回元素的顺序和计数每次都相同 ->集合保持不变(就像每种情况下的1.:double, 2.:int一样(

如果要

返回多个值,可以返回包装不同值的类的实例。

如果你不关心丢失语义,你可以返回一个std::tuple 1

auto myCoolFunction(int myParam1) {
    return std::make_tuple(5, "nice weather", 5.5, myCoolMat);        
}

如果要强制使用类型(例如,使用std::string而不是const char *(:

std::tuple<int, std::string, double, cv::Mat> myCoolFunction(int myParam1) {
    return {5, "nice weather", 5.5, myCoolMat};
}

在这两种情况下,您都可以使用 std::get 访问这些值:

auto tup = myCoolFunction(3);
std::get<0>(tup); // return the first value
std::get<1>(tup); // return "nice weather"

1 如果你有一个兼容 C++17 的编译器,你可以利用模板参数推导并简单地返回std::tuple{5, "nice weather", 5.5, myCoolMat}

是的

,一个函数可以在一个std::tuple内返回多种类型的不同值,自 C++11 起在标准库中可用:

#include <tuple>
std::tuple<int, std::string, double, cv::Mat>
myCoolFunction(int myParam1) {
    return { 5, "nice weather", 5.5, myCoolMat }
}

如果允许您使用 C++14 代码,则甚至不必声明类型:

#include <tuple>
auto myCoolFunction(int myParam1) {
     return std::make_tuple(5, "nice weather", 5.5, myCoolMat);
}

这是这两个版本编译的证据(没有cv::Mat - 我不认为 GodBolt 有这个可用(。

笔记:

  • 如果使用 std::make_tuple ,则类型可能不完全符合您的预期。例如,在这种情况下,你会得到一个char *尽管在显式定义元组时,你可以像我上面一样强制它std::string。这通常不是问题。
  • 如果某些数据很大,您可以尝试std::move它,以避免复制整个内容,例如传递std::move(myCoolMat)

你可以返回一个结构或使用 std::tuple。

使用结构体,您可以执行以下操作:

myStruct create_a_struct() {
  return {20, std::string("baz"), 1.2f};
}

并使用 std::tuple

std::tuple<int, std::string, float> create_a_tuple() {
  return {20, std::string("baz"), 1.2f};
}

(回答真的是为了娱乐,并展示C++的力量,而不是其他任何东西。

一种方法,这确实相当邪恶,因为您给呼叫站点取消选择内容带来了负担,那就是使用

std::shared_ptr<void>

作为返回类型。这是允许的,因为std::shared_ptr支持类型擦除。(不幸的是,std::unique_ptr没有,所以你必须排除这一点。

显然,在函数中,您需要使用std::make_shared或类似功能。

参考:为什么shared_ptr<无效>合法,而unique_ptr<无效>却格式不正确?

返回 std::variant 的 std::vector of std::

variant,其中 std::variant 是模板参数化到您选择的类型。如果任何类型实际上都是可能的,我不确定你为什么要使用结构而不是简单地写入内存空间;没有结构中的对象和类型的确定性概念具有低价值。

相关内容

  • 没有找到相关文章

最新更新