我想有一个整数向量和一些代码,以最通用的方式(在编译时)处理该向量。向量元素类型。例如:
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 ++标准。
答案 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());