gpt4 book ai didi

c++ - 返回元组的可变参数模板

转载 作者:行者123 更新时间:2023-11-30 03:14:49 25 4
gpt4 key购买 nike

我想从 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()不同于23 (例如 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() 的测试(其中 vecstd::vector )是不可能的。

关于c++ - 返回元组的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57465377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com