具有默认参数的模板 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;
};
我正在尝试将模板 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;
};