容器类型和编译时类型推导
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());
我想要一个整数向量和一些代码,以最通用的方式(在编译时)处理该向量 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());