[英]template non-type template parameter?
我正在尝试使用非类型模板参数,该类型是这样的模板实例:
template<size_t num> class BitValue { ... };
class Foo {
// works
template<template<size_t> class BitValue, size_t num>
bool get(BitValue<num> && t) { ... }
// fails
template<typename T> bool
template<Bitvalue<num> bit> bool get() { ... };
template<template <size_t> Bitvalue bit> bool get() { ... };
template<template <size_t> class Bitvalue bit> bool get() { ... };
template<template <size_t> BitValue, size_t num, Bitvalue<num> bit> bool get() { ... };
};
您可能会说:为什么不使用foo.get(value)
? Foo表示一种具有多位值和单大值的位域。 我想要位域的所有成员都使用foo.get <...>()来保持一致性。
为什么不使用`foo.get <typeof(value)>'? foo.get <MultiBitType>()返回多位字段的值。 foo.get <SingleBitType>()返回一位类型的原始值。 但是不幸的是,有些东西被否定了。 因此foo.get <NegatedValue>()应该返回!foo.get <typeof(NegatedValue)>()。
是否有可能完全拥有模板非类型模板参数? 如果是这样怎么办?
由于允许的类型为[temp.param],因此不可能具有BitValue<size_t>
类型的非类型模板参数:
非类型模板参数应具有以下(可选,具有cv限定)类型之一:
(4.1)—整数或枚举类型,
(4.2)—指向对象或函数的指针,
(4.3)—对对象的左值引用或对函数的左值引用,
(4.4)—指向成员的指针,
(4.5)—std::nullptr_t
。
但是您可以仅使用任何类型的模板并将其委托给元函数:
template <typename T>
bool get() {
size_t bit = bit_number<T>::value;
...
}
哪里:
template <typename T> struct bit_number;
template <size_t N>
struct bit_number<BitValue<N>> : std::integral_constant<size_t, N> { };
// other specializations
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.