【问题标题】:Container type and compile-time type deduction容器类型和编译时类型推导
【发布时间】:2018-09-12 07:08:39
【问题描述】:

我想要一个整数向量和一些代码,它以最通用的方式(在编译时)w.r.t 处理该向量。向量元素类型。例如:

std::vector<uint16_t> X;
...
X.push_back(rand() % std::numeric_limits<X::value_type>::max());

但是编译器说:

the value of X is not usable in a constant expression

为什么不能在这种情况下使用X::value_type?我的意思是X 的元素类型一旦用具体的元素类型声明就不能改变,这可以仅从这段代码的语法中推断出来。 如果我更改声明的X 的元素类型(另一个整数),但由于该更改不想更改push_back 字符串,应该采取什么方法?我假设任何现代 C++ 标准。

【问题讨论】:

  • 泛化很好。虽然不是为了概括。如果您显示的内容确实在一个范围内,那么确实没有必要像那样扭曲您的代码。

标签: c++ templates stl compile-time type-deduction


【解决方案1】:

X 是对象的名称,而不是类型。可以使用decltype(C++11 起)获取X 的类型。

X.push_back(rand() % std::numeric_limits<decltype(X)::value_type>::max());

【讨论】:

  • @orlp 它产生uint16_t&amp;,而不仅仅是uint16_t
  • 我认为numeric_limits 会衰减,但我想我错了。
  • @orlp 是的,它没有;必须使用std::remove_reference 才能使其工作。
【解决方案2】:

如果您将其更改为在类型(而不是实例 - 我认为这不是有效的 C++)上调用 value_type,它将编译并工作 (godbolt)。

using vec_t = std::vector<uint16_t>;
vec_t X;
// or the other way around:
// auto X = std::vector<uint16_t>();
// using vec_t = decltype(X);
X.push_back(rand() % std::numeric_limits<vec_t::value_type>::max());

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2016-12-13
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多