繁体   English   中英

模板非类型模板参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM