【问题标题】:Template class with default parameters used in another template class with access to default parameters具有默认参数的模板类在另一个可以访问默认参数的模板类中使用
【发布时间】:2018-08-16 16:32:33
【问题描述】:

我试图将一个模板类放入另一个(包装器)模板类中,而第一个模板类有一个我需要在包装器类中使用的默认参数。这里是:

template <typename A, size_t B, typename C = size_t, bool D = true>
class MyClass;

这个类只能与给定的 2、3 或 4 个参数一起使用:

MyClass<int, char> object1;
MyClass<int, char, uint8_t> object2;
MyClass<int, char, uint8_t, false> object3;

包装类应该像这样使用 MyClass 的任何可能数量的参数来实例化:

Wrapper<MyClass<uint8_t, 210>> firstWrapper;

还有

Wrapper<MyClass<uint8_t, 210, uint8_t>> secondWrapper;
Wrapper<MyClass<uint8_t, 210, uint8_t, false>> thirdWrapper;

包装模板类因此有一个模板模板参数,但在这里我需要参数 C,它并不总是直接给出。我为 Wrapper 类尝试了这两种实现,但它们都不起作用:

变体 A:

// at least 2 parameters do not have a default value
template <template <typename, typename, typename...> class CONTAINER, typename A, typename B, typename... Ts>
class Wrapper<CONTAINER<A, B, Ts...>> {
private:
    CONTAINER<A, B, Ts...>& m_container;
    C m_index; //  < ---- How can I access the (default) parameter C 
}

变体 B:

template <template <typename, typename, typename, typename> class CONTAINER, typename A, typename B, typename C, typename D>
class Wrapper<CONTAINER<A, B, C, D>> {
private:
    CONTAINER<A, B, C, D>& m_container;
    C m_index; // works!
}

但是对于这个变体,我必须指定 MyClass 的所有 4 个模板参数,并且不能只使用 C 和 D 的默认值。

我需要如何修改我的 Wrapper 类,以便它可以处理 MyClass 的 2、3 和 4 个给定模板参数,同时我仍然可以访问第三个参数的默认值?

【问题讨论】:

    标签: c++ templates default-arguments


    【解决方案1】:
    // primary template
    template <typename T>
    class Wrapper;
    
    // partial specialization
    template <template <typename, size_t, typename, bool> class CONTAINER, typename A, size_t B, typename C, bool D>
    class Wrapper<CONTAINER<A, B, C, D>>;
    

    那你就可以了

    // the default template arguments of MyClass will be used
    Wrapper<MyClass<uint8_t, 210>> firstWrapper;                 // A=uint8_t, B=210, C=size_t, D=true
    Wrapper<MyClass<uint8_t, 210, uint8_t>> secondWrapper;       // A=uint8_t, B=210, C=uint8_t, D=true
    Wrapper<MyClass<uint8_t, 210, uint8_t, false>> thirdWrapper; // A=uint8_t, B=210, C=uint8_t, D=false
    

    【讨论】:

      【解决方案2】:

      您的Wrapper 似乎总是使用具体类型、完全专用的MyClass 模板来实例化。

      template <typename A, size_t B, typename C = size_t, bool D = true>
      class MyClass
      {
      public:
          using A_arg = A;
          static const size_t B_arg = B;
          using C_arg = C;
          static const bool D_arg = D;
      };
      
      template <typename Container>
      class Wrapper {
      private:
          Container& m_container;
          typename Container::C_arg m_index;
      };
      

      Wandbox

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 2022-01-19
        • 2014-11-06
        相关资源
        最近更新 更多