私はVisual Studio Community 2015を使用していますが、私は並列ベクトルテンプレートを実装しようとしています。これはまだ私がバリデーショナルのテンプレートを習得していないので、私の学習の練習です。展開が期待どおりに機能していません。Variadicテンプレートの展開が予期しないように
私がget_elemsから期待するのは、対応するベクトルインデックスのパラメータパックタイプの参照のタプルです。私が得るのは、パラメータパックの最初の型だけのタプルです。
私はparallel_vector<int, char>
でテストしました。
template <typename... Elems>
class parallel_vector
{
using t_data_type = std::tuple<std::vector<Elems>...>;
using reference_type = std::tuple < Elems&... >;
t_data_type data_;
// Example 1
// C2440 'return': cannot convert from 'std::tuple<int &>' to 'std::tuple<int &,char &>'
template <size_t... N>
auto get_elems(std::index_sequence<N...>, size_t index)
{
return std::forward_as_tuple(std::get<N>(data_)[index]...);
}
// Example 2
// C2440 '<function-style-cast>': cannot convert from 'int' to 'std::tuple<int &,char &>'
template <size_t... N>
reference_type get_elems(std::index_sequence<N...>, size_t index)
{
return reference_type(std::get<N>(data_)[index]...);
}
public:
reference_type operator[](size_t index)
{
return get_elems(std::index_sequence_for<Elems>{}, index);
}
};
エラーはコードコメントに記載されています。これらは私が試みたものです。私はバリデーショナルなテンプレートの根本的な誤解があると推測します。お知らせ下さい。
はOKらしい、gccと打ち鳴らすの罰金コンパイルします。私はVS2015がC++ 14に対する本当に悪いサポートを持っていると聞いたことがあります。あなたはこれを打っているかもしれませんか? – SergeyA