我试图将一个模板类放到另一个(包装器)模板类中,而第一个模板类具有我需要在包装器类中使用的默认参数。在这里:
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个参数的默认值?
答案 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;
};