1

を に変換しようとし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))...;

ここで何が問題なのかわかりません。

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すべての要素が確実に を返すようにするために、 を添付する必要がある場合がありますret_t)

于 2015-08-04T19:46:40.770 に答える