![](/img/trans.png)
[英]reinterpret_cast vector of pointers to vector of pointers to base class
[英]vector with reinterpret_cast
以下代碼僅向向量col
插入一個值。 代碼是從DBMS代碼庫中提取的(用於導入文件),具體來說,它來自1
代碼使用 void* 來讀取任何字段類型(int、float 等)。
#include <iostream>
#include <vector>
using namespace std;
void add(std::vector<void*> &col){
reinterpret_cast<std::vector<int>&>(col).push_back( 1);
reinterpret_cast<std::vector<int>&>(col).push_back( 2);
reinterpret_cast<std::vector<int>&>(col).push_back( 13);
}
int main() {
std::vector<void*> col;
add(col);
cout << col.size() << endl;
for(int i=0;i<col.size();i++)
cout <<reinterpret_cast<std::vector<int>&> (col)[i] <<endl;
return 0;
}
我不確定這段代碼是如何工作的?
您的代碼表現出未定義的行為。
std::vector<void*>
和std::vector<int>
是兩個完全獨立且不相關的類型,您不能像現在這樣安全地在它們之間進行轉換,尤其是因為不能保證void*
和int
是相同的字節大小。
投射您正在推動的值,不要投射vector
本身,例如:
#include <iostream>
#include <vector>
#include <cstdint>
using namespace std;
void add(std::vector<void*> &col) {
col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(1)));
col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(2)));
col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(13)));
}
int main() {
std::vector<void*> col;
add(col);
cout << col.size() << endl;
for(int i=0;i<col.size();i++)
cout << reinterpret_cast<intptr_t>(col[i]) << endl;
return 0;
}
當然,您確實應該使用正確的容器類型開始:
#include <iostream>
#include <vector>
using namespace std;
void add(std::vector<int> &col) {
col.push_back(1);
col.push_back(2);
col.push_back(13);
}
int main() {
std::vector<int> col;
add(col);
cout << col.size() << endl;
for(int i=0;i<col.size();i++)
cout << col[i] << endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.