1

我正在尝试将 a 转换std::tuplestd::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))...;

我看不出这里有什么问题。

4

1 回答 1

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附加 a 以确保所有元素都返回 a ret_t

于 2015-08-04T19:46:40.770 回答