将std :: tuple转换为std :: set

时间:2015-08-04 19:42:30

标签: c++ c++11 variadic-templates c++14 stdtuple

我正在尝试将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))...;

我不知道这里有什么问题。

1 个答案:

答案 0 :(得分:2)

此:

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