Return 元组的可变参数模板
Return a variadic template of tuple
我想从 std::vector
中的元素创建一个 std::tuple
,并从我的函数中创建 return。 std::vector
的大小并不总是三个,所以我需要一个可以从三个、四个和更多元素创建 std::tuple
和 return 的函数。
#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
”作为从函数 return 编辑的值类型。
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()
编辑的类型 return。
鉴于returned类型依赖于参数的size()
,即已知运行-time,编译器无法选择,编译时,正确return
语句所以无法选择正确的 returned 类型。
也就是说,临界点是函数体
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]);
En passant:如果 vec.size()
与 2
或 3
不同(例如 1
),编译器不知道 return 是什么.但与 std::make_tuple(vec[0], vec[1])
和 std::make_tuple(vec[0], vec[1], vec[2])
给出不同且不兼容的类型相比,这是一个小问题。
所以编译器无法选择函数 return 是 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
) 是不可能的。
我想从 std::vector
中的元素创建一个 std::tuple
,并从我的函数中创建 return。 std::vector
的大小并不总是三个,所以我需要一个可以从三个、四个和更多元素创建 std::tuple
和 return 的函数。
#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
”作为从函数 return 编辑的值类型。
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()
编辑的类型 return。
鉴于returned类型依赖于参数的size()
,即已知运行-time,编译器无法选择,编译时,正确return
语句所以无法选择正确的 returned 类型。
也就是说,临界点是函数体
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]);
En passant:如果 vec.size()
与 2
或 3
不同(例如 1
),编译器不知道 return 是什么.但与 std::make_tuple(vec[0], vec[1])
和 std::make_tuple(vec[0], vec[1], vec[2])
给出不同且不兼容的类型相比,这是一个小问题。
所以编译器无法选择函数 return 是 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
) 是不可能的。