Max*_*Max 13 c++ tuples variadic-templates c++11
如何将类型从可变参数模板参数转换为另一种类型?
例如:
template <typename... T>
struct single
{
std::tuple<T...> m_single;
};
template <typename... T>
struct sequences
{
single<T...> get(size_t pos)
{
// I don't know how to convert here
return std::make_tuple(std::get<0>(m_sequences)[pos]... std::get<N>(m_sequences)[pos]);
}
template <size_t Idx>
std::vector<
typename std::tuple_element<Idx, std::tuple<T...>>::type
>
get_sequence()
{
return std::get<Idx>(m_sequences);
}
std::tuple<T...> m_sequences; // std::tuple<std::vector<T...>> I don't know how to conver here
};
Run Code Online (Sandbox Code Playgroud)
我想这样写:
sequences<int, double, double> seq;
single<int, double, double> sin = seq.get(10);
Run Code Online (Sandbox Code Playgroud)
并且具有std::tuple<std::vector<int>, std::vector<double>, std::vector<double>>结构序列.并从中获得单身.
std::vector<single<T...>> 对我来说是个坏主意,因为我需要一个完整的序列,并且很容易从中复制它.
可能吗?
非常感谢你.对不起,我的英语不好.
Ant*_*ams 16
您可以做的不仅仅是将可变参数包扩展为普通列表:您也可以扩展表达式.因此,您可以m_sequences成为向量元组而不是元素元组:
template <typename... T>
struct sequences
{
std::tuple<std::vector<T>...> m_sequences;
};
Run Code Online (Sandbox Code Playgroud)
您还可以使用参数包执行漂亮的技巧,从矢量中选择适当的元素:
template<size_t ... Indices> struct indices_holder
{};
template<size_t index_to_add,typename Indices=indices_holder<> >
struct make_indices_impl;
template<size_t index_to_add,size_t...existing_indices>
struct make_indices_impl<index_to_add,indices_holder<existing_indices...> >
{
typedef typename make_indices_impl<
index_to_add-1,
indices_holder<index_to_add-1,existing_indices...> >::type type;
};
template<size_t... existing_indices>
struct make_indices_impl<0,indices_holder<existing_indices...> >
{
typedef indices_holder<existing_indices...> type;
};
template<size_t max_index>
typename make_indices_impl<max_index>::type make_indices()
{
return typename make_indices_impl<max_index>::type();
}
template <typename... T>
struct sequences
{
std::tuple<std::vector<T>...> m_sequences;
template<size_t... Indices>
std::tuple<T...> get_impl(size_t pos,indices_holder<Indices...>)
{
return std::make_tuple(std::get<Indices>(m_sequences)[pos]...);
}
std::tuple<T...> get(size_t pos)
{
return get_impl(pos,make_indices<sizeof...(T)>());
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |