我有一个这样的 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
是标准::堆栈
。一般来说,假设可能有 t4
等等。
当然,我的第二个定义已经解决了这个问题,但我希望推导是自动的:只给定 T
和 tuple_t
,构建我 derived_tuple_t
。像这样:
template <class T, class tuple_t> using derived_tuple_t = std::tuple</*???*/>;
这样的事情可能吗?也许是一个简短的解决方案?
最佳答案
您可以使用两个模板参数声明结构 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
可以接受多个模板参数(当其他但第一个具有默认值时),代码将不会失败。
关于c++ - 从元组派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17103860/