簡體   English   中英

返回元組的可變參數模板

[英]Return a variadic template of tuple

我想從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 '作為從函數返回的值類型。

我想從vector中的元素創建一個元組,然后從我的函數中返回它。 向量的大小並不總是3,因此我需要一個可以從3、4和更多元素創建元組並將其返回的函數。

簡短的答案:您不能。

長答案。

正如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() :如果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 )來決定測試是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM