我有一个像这样的std :: tuple:
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</*???*/>;
这样的事情可能吗?也许是一个简短的解决方案?
答案 0 :(得分:4)
您可以使用两个模板参数声明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
可以接受多个模板参数(当其他人首先有默认值时),代码不会失败。
答案 1 :(得分:3)
使用模板模板参数进行一些部分专业化应该完成工作(一般化为可变参数模板,而不仅仅是元组):
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;
请注意,对于不使用真正的可变参数模板的stdlib,这可能会出现问题,并使用宏机制和默认模板参数(如MSVC)来模拟它。