2010-03-17 73 views
5

假设你有一个元组,并且想通过在每个类型的第一个元组上应用一个元函数来生成一个新的元组。什么是完成这项任务的最有效的C++元功能?是否也可以使用C++ 0x variadic模板来提供更好的实现?从元组生成元组

+1

Boost.MPL可能很有意思,它有一个'transform'元函数。 – GManNickG 2010-03-17 07:42:48

回答

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; 

希望它有帮助。

+0

酷利(awgn)。 – 2010-03-17 08:41:29