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

Container type and compile-time type deduction

我想要一个整数向量和一些代码,以最通用的方式(在编译时)处理该向量 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++ 标准。

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

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

如果您将其更改为在类型上调用 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());