Сцепление вариационных шаблонов вместе - PullRequest
5 голосов
/ 07 января 2012

Как бы выглядел X в следующем коде, если бы он был преобразован для использования переменных шаблонов C ++ 11 и должен поддерживать произвольное количество аргументов шаблона?

template<int OFFSET>
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; };

template<int OFFSET>
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; };

template<int OFFSET>
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; };

template < template <int> class B0,
           template <int> class B1,
           template <int> class B2  >
struct X : public B0<1>,
                  B1<B0<1>::size * B0<1>::offset >,
                  B2< B1<B0<1>::size * B0<1>::offset >::size *
                      B1<B0<1>::size * B0<1>::offset >::offset >
{ };

int main(int argc, const char *argv[])
{
    X<A, B, C> x;
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Может быть:

template <int Var, template <int> Head, typename... Tail>
struct X_helper : Head<Var>,
                , X_helper<Head<Var>::size * Head<Var>::offset, Tail...>
{};

template <int Var, template <int> Arg>
struct X_helper : Head<Var>
{};

template <typename... Args>
struct X : X_helper<1, Args...>
{};

Надеюсь, я правильно понял семантику.

0 голосов
/ 05 июля 2016

Вам все еще интересен этот вопрос?

Я курсирую с C ++ 11, поэтому я попытался ответить.

Я не уверен, что понимаю, чего вы хотите (ну ... что вы хотели в 2012 году), но я думаю, что следующий пример должен поймать ваши требования.

template<int OFFSET>
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; };

template<int OFFSET>
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; };

template<int OFFSET>
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; };

template <int N, template <int> class ...>
   struct H;

template <int N>
   struct H<N>
    { };

template <int N,
          template <int> class C1,
          template <int> class ... Cs>
   struct H<N, C1, Cs...> : public C1<N>,
                            public H<C1<N>::size * C1<N>::offset, Cs...>
    { };

template <template <int> class ... C>
   struct X : public H<1, C...>
    { };

int main()
 {
   X<A, B, C> x;

   return 0;
 }

p.s .: извините за мой плохой английский

...