代码之家  ›  专栏  ›  技术社区  ›  Nicola Bonelli

从元组生成元组

  •  5
  • Nicola Bonelli  · 技术社区  · 14 年前

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

    1 回复  |  直到 13 年前
        1
  •  8
  •   Johannes Schaub - litb    14 年前

    这个怎么样:

    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;
    

    希望有帮助。