【问题标题】:template non-type template parameter?模板非类型模板参数?
【发布时间】:2015-04-10 10:53:44
【问题描述】:

我正在尝试使用非类型模板参数,其类型是这样的模板实例:

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'? foo.get() 返回多位字段的值。 foo.get() 返回单位类型的原始值。但不幸的是,有些位被否定了。所以 foo.get() 应该返回 !foo.get()。

如果可以有一个模板非类型模板参数,有什么想法吗?如果是的话怎么办?

【问题讨论】:

  • 不清楚你在说什么——你需要重载get(),其中get&lt;X&gt;()返回X位,而get()只返回一位?
  • 您既不能推断非类型模板参数的类型,也不能使用自定义类的实例作为非类型模板参数。你是说this 吗?
  • @myaut 我想重载 get() 所以 get() 是有效的,而不仅仅是 get() ,其中 value 的类型是模板类。
  • @PiotrS。不,您正在使用一种类型。不仅仅是位位置num 很重要,get() 也需要BitValue&lt;num&gt; value 的值。
  • @GoswinvonBrederlow 这就是为什么我解释说这不可能是你想要的

标签: c++ templates non-type


【解决方案1】:

不可能有BitValue&lt;size_t&gt; 类型的非类型模板参数,因为允许的类型是[temp.param]:

非类型模板参数应具有以下类型之一(可选 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

【讨论】:

  • PiotrS 已经建议在 cmets 中使用类型而不是值。我已经让它适用于类型。我知道我不能使用非类型的 BitValue 但是如何使它成为 BitValue* 或 BitValue&?这应该适合 4.2 和 4.3。那是什么语法?
  • @GoswinvonBrederlow 语法为template &lt;size_t N, BitField&lt;N&gt;* bf&gt; bool get() { .. },但bf 必须有链接。而且无论如何你都必须通过N - 所以它是一个比你开始使用的解决方案更具限制性,更不可用的解决方案。
猜你喜欢
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多