“部分应用”对于模板参数

发布于 2024-12-05 03:06:45 字数 634 浏览 2 评论 0原文

我有以下“主”模板:

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

I have the following “main” template:

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

and the template I want to use with TT:

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

In particular, I want to use something like

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

It is a kind of partial application for templates. I know that Boost.MPL involves this kind of stuff. The problem is that I already have some code using TT and templates like

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

which are fed to TT.

So the question is: how can I use S1 with TT with smallest modifications to existing code. If it is mandatory to use Boost.MPL please show me most suitable solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如果没结果 2024-12-12 03:06:45

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

Define a class template deriving from S1 as:

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

And then use S11, instead of S1 as:

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

Working code : http://ideone.com/y2s7n


Reading your comment, it seems you need this:

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

鹤仙姿 2024-12-12 03:06:45

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

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

you can also write a generic partial application facility:

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

or like this if you want the result time of the application to be the original template's specializations instead of a derived class (of a derived class, etc.):

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 ;
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文