容器类型和编译时类型推导

时间:2018-09-12 07:08:39

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

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

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 ++标准。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果将其更改为对某个类型(而不是实例-我认为这不是有效的value_type)调用C++,它将编译并正常工作(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());