我试图使用非类型模板参数,类型是这样的模板实例:
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&lt; ...&gt;()为bitfield的所有成员保持一致。
为什么不使用`foo.get&lt; typeof(value)&gt;&#39;? foo.get&lt; MultiBitType&gt;()返回多位字段的值。 foo.get&lt; SingleBitType&gt;()返回单比特类型的原始值。但不幸的是,有些比特被否定了。所以foo.get&lt; NegatedValue&gt;()应该返回!foo.get&lt; typeof(NegatedValue)&gt;()。
任何想法是否可以拥有模板非类型模板参数?如果是这样的话?
答案 0 :(得分:2)
由于允许的类型是[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