«Частичное приложение» для параметров шаблона - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть следующий «основной» шаблон:

template <
        template <typename> class S
    > struct TT { /*...*/ };

и шаблон, который я хочу использовать с TT:

template <int N, typename T> struct S1 {};

В частности, я хочу использовать что-токак

TT< S1<5> > t2; // "Invalid template arguments" here

Это своего рода частичное приложение для шаблонов.Я знаю, что Boost.MPL включает в себя такие вещи.Проблема в том, что у меня уже есть некоторый код, использующий TT и шаблоны типа

template <typename T> struct S2 {}; // S3, S4…

, которые передаются в TT.

Итак, вопрос в том, как я могу использовать S1 с TT с наименьшими изменениями в существующем коде.Если необходимо использовать Boost.MPL, пожалуйста, покажите мне наиболее подходящее решение.

Ответы [ 2 ]

8 голосов
/ 15 сентября 2011

Определить шаблон класса, полученный из S1 как:

template <typename T> 
struct S11 : S1<5,T>
{
};

А затем используйте S11 вместо S1 как:

TT< S11> t2;  //it is as if TT< S1<5> > t2

Рабочий код: http://ideone.com/y2s7n


Читая ваш комментарий, кажется, вам нужно это:

template<int N>
struct Magic
{
   template <typename T> 
   struct S11 : S1<N,T>
   {
   };
};

//Usage
TT<Magic<5>::S11> t2;

Магия Демо: http://ideone.com/4yxvK

3 голосов
/ 09 декабря 2014

Вы также можете написать общее средство частичного применения:

template <template <typename ...> class TT, typename... Args>
struct Apply
{
    template <typename... Rest>
    struct T : TT < Args..., Rest... >
    {
    };
};

или подобное, если вы хотите, чтобы результатом результата приложения была специализация исходного шаблона вместо производного класса (производного класса и т. Д.):

template <template <typename ...> class TT, typename... Args>
struct Apply
{
    template <typename... Rest>
    struct _T  
    { 
        typedef TT < Args..., Rest... > type;
    };

    template <typename... Rest>
    using T = typename _T < Rest... >::type ;
};
...