Variadic 模板扩展不符合预期
Variadic template expansion not as expected
我正在使用 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);
}
};
错误在代码注释中。这些是我尝试过的。我想我对可变参数模板有一个根本性的误解。请指教
使用未展开的参数包格式不正确:
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);
// ^^^
}
我正在使用 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);
}
};
错误在代码注释中。这些是我尝试过的。我想我对可变参数模板有一个根本性的误解。请指教
使用未展开的参数包格式不正确:
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);
// ^^^
}