模板参数的“部分应用”

时间:2011-09-15 19:12:36

标签: c++ templates boost-mpl

我有以下“主要”模板:

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 个答案:

答案 0 :(得分:8)

将从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

答案 1 :(得分:3)

您还可以编写通用的部分应用程序工具:

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 ;
};
相关问题