它认为从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<无效>却格式不正确?无效>无效>
variant,其中 std::variant 是模板参数化到您选择的类型。如果任何类型实际上都是可能的,我不确定你为什么要使用结构而不是简单地写入内存空间;没有结构中的对象和类型的确定性概念具有低价值。