具有默认参数的模板类在另一个可访问默认参数的模板类中使用

时间:2018-08-16 16:32:33

标签: c++ templates default-arguments

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

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个给定的模板参数,而我仍然可以访问第3个参数的默认值?

2 个答案:

答案 0 :(得分:3)

Traceback (most recent call last):
  File "Untitled 8.py", line 33, in <module>
    print data [item]
TypeError: list indices must be integers, not unicode

那么你可以

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

答案 1 :(得分:1)

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

相关问题