模板非类型模板参数?

时间:2015-04-10 10:53:44

标签: c++ templates non-type

我试图使用非类型模板参数,类型是这样的模板实例:

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;()。

任何想法是否可以拥有模板非类型模板参数?如果是这样的话?

1 个答案:

答案 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