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

标签 c++ c++11 templates variadic-templates stdtuple

我想从 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/

相关文章:

c++ - wxWidgets 事件表是哪种 C++ 语句?

c++ - 将 NULL 作为参数传递时,函数重载如何工作?

image - Magento:交易电子邮件。如何从自定义模板添加图像

python - 在 Django 的 View/Template 中引用多个 Model

c++ - 为全局 constexpr 变量生成唯一值

C++ SFINAE 在引用类型和转换为引用的参数之间选择重载?

c++ - 将快速委托(delegate)转换为标准函数

c++ - 多次调用索引运算符的性能

c++ - 使用自定义 std::ostream 包装 FILE*

c++ - 如何从C++中的嵌套类调用变量