Генерация кортежей из кортежей - PullRequest
5 голосов
/ 17 марта 2010

Скажем, у вас есть кортеж и вы хотите создать новый кортеж, применив метафункцию к каждому типу первого.Какое наиболее эффективное метафункция C ++ для решения этой задачи?Можно ли также использовать шаблон переменных C ++ 0x, чтобы обеспечить лучшую реализацию?

1 Ответ

8 голосов
/ 17 марта 2010

Как насчет этого:

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;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...