[英]Duplicates when inserting into std::set<std::tuple<std::string, …>>
[英]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.