【问题标题】:“Partial application” for template parameters模板参数的“部分应用”
【发布时间】:2011-09-15 19:12:35
【问题描述】:

我有以下“主要”模板:

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

【问题讨论】:

  • template &lt;class S&gt; struct TT { /*...*/ }; 不是一个选项吗?
  • TT&lt; S1&lt;5&gt; &gt; t2; 您缺少 S1 的第二个参数。显而易见的大师。
  • @Mooing 谢谢,我已经考虑过这个选项,但是 TT 确实有内部 typedef(比如 P),这实际上是一个“实现细节”,并且 TT 用 P 指定了 S。此时我可以'不知道如何让 TT 接受类型而不是具有至少一个类型参数的模板。
  • @AJG85 显然提供第二个参数不会使这个编译以及 - 所以问题的本质......
  • @Artem Pelenitsyn:请参阅 Nawaz 的回答,不需要嵌套模板。您可以将默认的 int 参数添加到 S11 模板,并在需要时将其传递给包装器。

标签: c++ templates boost-mpl


【解决方案1】:

将派生自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

【讨论】:

    【解决方案2】:

    你也可以写一个通用的偏应用工具:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多