簡體   English   中英

將std :: tuple轉換為std :: set

[英]Converting a std::tuple to a std::set

我正在嘗試將std::tuple轉換為std::set 我有以下代碼

template <typename... T>
auto to_set(std::tuple<T...> const &t) {
  return to_set_helper(t, std::index_sequence_for<T...>{});
}

template <typename T, size_t... Is>
auto to_set_helper(T&& t, std::index_sequence<Is...>) {
  using set_t = typename std::tuple_element<0, 
                      typename std::remove_reference<T>::type>::type;
  std::set<set_t> ret;
  ret.insert(std::get<Is>(t))...;
  return ret;
}

編譯器抱怨解包該行的參數包

ret.insert(std::get<Is>(t))...;

我看不出這里有什么問題。

這個:

ret.insert(std::get<Is>(t))...;

不是參數包擴展的有效上下文。 不幸。 但是有一些方法可以做您想做的事情:

有標准的擴展器技巧:

using expander = int[];
expander{0,
    (void(ret.insert(std::get<Is>(t))), 0)...
    };

或者,您可以僅依賴於可以使用initializer_list構造set的事實:

return std::set<ret_t>{std::get<Is>(t)...};

(這可能需要附加static_cast ,以確保所有元素都返回ret_t

暫無
暫無

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

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