从元组生成元组

时间:2010-03-17 07:38:49

标签: c++ metaprogramming c++11

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

1 个答案:

答案 0 :(得分:8)

这个怎么样:

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<typename...> 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;

希望它有所帮助。