[英]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()
不同於2
或3
(例如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()
(其中vec
是std::vector
)來決定測試是不可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.