将 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)...
};
或者你可以相信 set
可以用 initializer_list
:
构造
return std::set<ret_t>{std::get<Is>(t)...};
(可能需要附加一个 static_cast
以确保所有元素返回 ret_t
)
我正在尝试将 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)...
};
或者你可以相信 set
可以用 initializer_list
:
return std::set<ret_t>{std::get<Is>(t)...};
(可能需要附加一个 static_cast
以确保所有元素返回 ret_t
)