从元组生成元组

Posted

技术标签:

【中文标题】从元组生成元组【英文标题】:Generating tuples from tuples 【发布时间】:2010-03-17 07:38:48 【问题描述】:

假设您有一个元组,并希望通过对第一个元组的每种类型应用元函数来生成一个新元组。完成这项任务的最有效的 C++ 元函数是什么?是否也可以使用 C++0x 可变参数模板来提供更好的实现?

【问题讨论】:

Boost.MPL 可能很有趣,它有一个transform 元函数。 【参考方案1】:

这个怎么样:

template<typename Metafun, typename Tuple>
struct mod;

// using a meta-function class
template<typename Metafun, template<typename...> class Tuple, typename ...Types>
struct mod<Metafun, Tuple<Types...>> 
  typedef Tuple<typename Metafun::template apply<Types>::type...>
    type;
;

然后

typedef std::tuple<int, bool> tuple_foo;

struct add_pointer 
  template<typename T>
  struct apply  typedef T *type; ;
;

typedef mod<add_pointer, tuple_foo>::type tuple_ptrfoo;

这是通过将apply 包装到非模板中来使用元函数类。这允许将其传递给 C++03 模板(它不能通过简单地执行 template&lt;typename...&gt; class X 来接受带有任意参数的模板)。当然,你也可以接受纯元函数(不是类)

template<template<typename...> class Metafun, typename Tuple>
struct mod;

// using a meta-function
template<template<typename...> class Metafun, template<typename...> class Tuple, 
         typename ...Types>
struct mod<Metafun, Tuple<Types...>> 
  typedef Tuple<typename Metafun<Types>::type...>
    type;
;

并使用std::add_pointer 模板

typedef mod<std::add_pointer, tuple_foo>::type tuple_ptrfoo;

或者你可以将它包装到一个类中,这样它就可以与第一个版本兼容

// transforming a meta function into a meta function class
template<template<typename...> class Metafun>
struct ToClass 
  template<typename ... T>
  struct apply  typedef Metafun<T...> type; ;
;

typedef mod<ToClass<std::add_pointer>, tuple_foo>::type tuple_ptrfoo;

希望对你有帮助。

【讨论】:

以上是关于从元组生成元组的主要内容,如果未能解决你的问题,请参考以下文章

好好学python · 元组

从元组列表中返回具有最小 y 值的元组

从元组的元组中创建一个列表

从元组列表中获取具有“NaN”的元组索引

(Swift)如何从元组数组[(Date, MyClass)]中获取元组元素(Date, MyClass)的索引?

将项目添加到 Django 中的元组元组后是不是可以重新启动服务器?