我想从 std::vector
中的元素创建一个 std::tuple
并从我的函数返回它。 std::vector
的大小并不总是三个,所以我需要一个可以从三个、四个和更多元素创建一个 std::tuple
并返回它的函数.
#include <iostream>
#include <tuple>
#include <vector>
template<typename... Args>
std::tuple<Args...> create_tuple(const std::vector<int>& vec) {
if (vec.size() == 2)
return std::make_tuple(vec[0], vec[1]);
else if (vec.size() == 3)
return std::make_tuple(vec[0], vec[1], vec[2]);
}
int main() {
std::vector<int> vec{ 0, 1, 2 };
auto t = create_tuple(vec);
}
目前存在编译错误,请问如何解决?我使用的是 C++11,我不能使用“auto
”作为从函数返回的值类型。
最佳答案
I would like to create a tuple from elements in vector and return it from my function. The size of a vector will not always be three so I need a function that can create a tuple from three, four and more elements and return it.
简短的回答:你不能。
长答案。
正如 LogicStuff 在评论中所解释的那样,C++ 是一种静态类型语言。
这意味着,在您的情况下,编译器必须知道编译时 create_tuple()
返回的类型.
鉴于返回类型取决于 size()
的参数,即已知运行时,编译器无法选择,编译时,正确return
语句所以不能选择正确的返回类型。
换句话说,临界点是函数体
if (vec.size() == 2)
return std::make_tuple(vec[0], vec[1]);
else if (vec.size() == 3)
return std::make_tuple(vec[0], vec[1], vec[2]);
恩路人:如果vec.size()
不同于2
或 3
(例如 1
),编译器不知道返回什么。但与 std::make_tuple(vec[0], vec[1])
相比,这是一个小问题。和 std::make_tuple(vec[0], vec[1], vec[2])
给出不同的和不兼容的类型。
因此编译器无法选择函数是否返回 std::tuple<int, int>
或 std::tuple<int, int, int>
.
这类问题可以从 C++17 开始部分解决,使用 if constexpr
if constexpr (vec.size() == 2)
return std::make_tuple(vec[0], vec[1]);
else constexpr if (vec.size() == 3)
return std::make_tuple(vec[0], vec[1], vec[2]);
else // ???
还有if constexpr
不起作用,因为 if constexpr
需要一个必须决定编译时间和 vec.size()
的测试(其中 vec
是 std::vector
)是不可能的。
关于c++ - 返回元组的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57465377/