我想构建一个模板函数,将std::array转换为一个具有接受其坐标参数的构造函数的通用点。
template<typename PointT, size_t N>
PointT to(std::array<double, N> const& a)
{
return PointT(a[0], a[1], ...); // How to expand a?
}
我的问题是:有没有办法扩展
a
数组? 最佳答案
template <typename PointT, std::size_t N, std::size_t... Is>
PointT to(std::array<double, N> const& a, std::index_sequence<Is...>)
{
return PointT(a[Is]...);
}
template <typename PointT, std::size_t N>
PointT to(std::array<double, N> const& a)
{
return to<PointT>(a, std::make_index_sequence<N>{});
}
DEMO
注意:从C++ 14开始可以使用
index_sequence
/integer_sequence
实用程序。由于该问题被标记为C++11
,因此该答案中的演示代码利用了以下实现:namespace std
{
template <std::size_t... Is>
struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct make_index_sequence_h : make_index_sequence_h<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct make_index_sequence_h<0, Is...>
{
using type = index_sequence<Is...>;
};
template <std::size_t N>
using make_index_sequence = typename make_index_sequence_h<N>::type;
}
关于c++ - 如何将std::array转换为点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26442512/