Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 容器类型和编译时类型推断_C++_Templates_Stl_Compile Time_Type Deduction - Fatal编程技术网

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());