C++ 容器类型和编译时类型推断
我想要一个整数向量和一些代码,它们以最通用的方式(在编译时)处理向量,即向量元素类型。例如:C++ 容器类型和编译时类型推断,c++,templates,stl,compile-time,type-deduction,C++,Templates,Stl,Compile Time,Type Deduction,我想要一个整数向量和一些代码,它们以最通用的方式(在编译时)处理向量,即向量元素类型。例如: std::vector<uint16_t> X; ... X.push_back(rand() % std::numeric_limits<X::value_type>::max()); 为什么不能在这样的上下文中使用X::value\u type?我的意思是,X的元素类型一旦用具体的元素类型声明就不能更改,这可以仅从这段代码的语法中推断出来。 如果我更改了声明的X的元素类型(
std::vector<uint16_t> X;
...
X.push_back(rand() % std::numeric_limits<X::value_type>::max());
为什么不能在这样的上下文中使用X::value\u type
?我的意思是,X
的元素类型一旦用具体的元素类型声明就不能更改,这可以仅从这段代码的语法中推断出来。
如果我更改了声明的
X
的元素类型(另一个整数),但不想因为该更改而更改push_
字符串,那么应该采取什么方法?我假设任何现代C++标准。< /P> < P> <代码> x>代码>是对象的名称,而不是类型。您可以使用(自C++11)获取X
的类型
X.push_back(rand() % std::numeric_limits<decltype(X)::value_type>::max());
X.push_back(rand()%std::numeric_limits::max());
如果您将其更改为对类型(而不是实例-我认为这不是有效的C++
)调用value\u type
,它将编译并工作()
使用vec\u t=std::vector;
vec_t X;
//或者反过来说:
//auto X=std::vector();
//使用vec_t=decltype(X);
X.向后推(rand()%std::numeric_limits::max());
通用性很好。虽然不是仅仅为了泛化。如果您显示的内容确实在一个范围内,那么确实没有必要像那样扭曲您的代码。@orlp它产生uint16\u t&
,而不仅仅是uint16\u t
。我认为数值限制
会衰减,但我想我错了。@orlp是的,它不会<代码>标准::删除参考必须用于使其工作。
X.push_back(rand() % std::numeric_limits<decltype(X)::value_type>::max());
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());