4

我有以下“主要”模板:

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,请告诉我最合适的解决方案。

4

2 回答 2

8

定义一个派生自S1如下的类模板:

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

然后使用S11, 而不是S1as:

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

于 2011-09-15T19:23:17.697 回答
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 ;
};
于 2014-12-08T22:16:12.107 回答