从元组派生类
derive class from a tuple
我有一个std::元组,像这样:
typedef std::tuple<t1, t2, t3> tuple_t;
现在,我想把t3_tuple转换成一个类似的元组:
typedef std::tuple< T<t1>, T<t2>, T<t3> > derived_tuple_t;
在我的例子中,例如,t1
, t2
和t3
是原语,T
是std::stack
。一般情况下,假设可能存在t4
等。
当然,我的第二个定义已经解决了这个问题,但我希望推导是自动的:只给定T
和tuple_t
,构建derived_tuple_t
。这样的:
template <class T, class tuple_t> using derived_tuple_t = std::tuple</*???*/>;
这样的事情可能吗?也许有一个简短的解决方案?
可以用两个模板参数声明struct update_tuple
:
-
T
-将被模板化,这个参数我们将应用于tuple
中的参数。 -
std::tuple
模板参数可变数量
然后为新的tuple
创建一个别名,并使用包扩展与T
应用参数
#include <tuple>
#include <type_traits>
#include <vector>
template <template<class...> class, class>
struct update_tuple;
template <template <class...> class T, class... Args>
struct update_tuple<T, std::tuple<Args...>>
{
using type = std::tuple<T<Args>...>;
};
int main()
{
static_assert
(
std::is_same
<
std::tuple<std::vector<int>, std::vector<double>>,
update_tuple<std::vector, std::tuple<int, double>>::type
>::value,
"They are not same"
);
return 0;
}
感谢@Xeo:代码将不会失败,如果T
可以接受多个模板参数(当其他但首先有默认值)。
使用模板模板参数进行一点局部专门化就可以完成这项工作(推广到可变模板,而不仅仅是元组):
template<template<class...> class TT, class ArgsT>
struct make_over;
template<template<class...> class TT, template<class...> class ArgsT, class... Ts>
struct make_over<TT, ArgsT<Ts...>>{ using type = ArgsT<TT<Ts>...>; };
template<template<class...> class TT, class ArgsT>
using MakeOver = typename make_over<TT, ArgsT>::type;
请注意,对于不使用真正的可变模板的标准库来说,这可能会有问题,而是用宏机制和默认模板参数(如MSVC)来模拟它。
生活例子。
相关文章:
- C++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 将元组的向量转换/构造为堆
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 将元组的向量构造成堆
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 将元组类型扩展为可变参数模板?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 类内部和外部静态 constexpr 元组之间的差异
- 可变参数模板与使用元组在参数中添加不同的数据对
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- 创建派生自可变参数模板包的类型元组
- 为什么使用std ::元组和模板派生的类扣除/替换会扣除/替换
- 如何基于一些派生类型生成元组
- 从元组派生类
- 将从元组派生的对象放入C++中的向量中