2016-04-01 10 views
0

私は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); 
    } 
}; 

エラーはコードコメントに記載されています。これらは私が試みたものです。私はバリデーショナルなテンプレートの根本的な誤解があると推測します。お知らせ下さい。

+0

はOKらしい、gccと打ち鳴らすの罰金コンパイルします。私はVS2015がC++ 14に対する本当に悪いサポートを持っていると聞いたことがあります。あなたはこれを打っているかもしれませんか? – SergeyA

答えて

0

これは、パラメータパック未拡張を使用するための悪い形成されている:

reference_type operator[](size_t index) 
{ 
    return get_elems(std::index_sequence_for<Elems>{}, index); 
    //          ^^^^^ 
} 

index_sequence_for<Elems>index_sequence<0>あるmake_index_sequence<1>になるように、それは、実際には単一のタイプだという考えにMSVCを混同するようです。

修正がそれを拡大することです:

reference_type operator[](size_t index) 
{ 
    return get_elems(std::index_sequence_for<Elems...>{}, index); 
    //           ^^^ 
} 
関連する問題