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