可变参数模板扩展不如预期

时间:2016-04-01 18:20:00

标签: c++ visual-studio variadic-templates

我正在使用Visual Studio Community 2015,我正在尝试实现并行矢量模板。这对我来说是一次学习练习,因为我还没有掌握可变参数模板。扩张没有像预期的那样发挥作用。

我对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);
    }
};

错误在代码注释中。这些是我尝试过的。我认为我对可变参数模板有一个基本的误解。请指教。

1 个答案:

答案 0 :(得分:0)

使用未扩展的参数包时,这是不正确的:

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

这似乎让MSVC误以为它实际上只是一种类型,因此index_sequence_for<Elems>变为make_index_sequence<1> index_sequence<0>

修复是扩展它:

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