2010-03-17 80 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