模板参数为“部分应用”

“Partial application” for template parameters

本文关键字:应用 部分应用 参数      更新时间:2023-10-16

我有如下的" main "模板:

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。

所以问题是:我如何使用S1TT与最小的修改现有的代码。如果强制使用Boost。MPL请告诉我最合适的解决方案

定义一个从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;

Magic Demo: http://ideone.com/4yxvK

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

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 ;
};