具有默认参数的模板 class 在具有默认参数访问权限的另一个模板 class 中使用

Template class with default parameters used in another template class with access to default parameters

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

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

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

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

包装器 class 应像这样用 MyClass 的任何可能数量的参数实例化:

Wrapper<MyClass<uint8_t, 210>> firstWrapper;

还有

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

包装器模板 class 因此有一个模板化的模板参数,但在这里我需要参数 C,它并不总是直接给出。我为 Wrapper class 尝试了这两个实现,但其中 none 有效:

变体 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 class 以便它可以处理 MyClass 的第 2、3 和 4 个给定模板参数,同时我仍然可以访问第 3 个参数的默认值?

// 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

您的 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