我希望有一種方法可以爲具有大量可訪問(但不可編輯)數據成員的類的單個get函數編寫混合類型。如下面的代碼所示,使用一個包含成員地址的void * -cast副本的地圖是可行的,但只要將'const'引入到混合中以強制執行只讀,C++就會說: 'const void *'類型不能重寫以適當地訪問數據成員。下面的代碼適用於爲一類混合數據類型編寫單個get函數,但它有效地使get函數訪問所有數據成員爲public(具體請參閱memlist
類中的get
函數)。C++類型鑄造指向常量變量的指針
底線:
有沒有一種方法,使指針型澆注料,同時保留只讀在實際內存位置?或者更根本的是,是否可以定義一個類型強制轉換爲常量變量的指針?例如,在我看來,const type *var
爲只讀變量定義了一個只讀/不可轉換的地址,而我試圖找到一些東西(迄今爲止還不適用於我),更像type * const var
,儘管我一直沒有找到任何有關這方面的文件。
#include <iostream>
#include <string>
#include <map>
class A{
public:
A(int a, double b): a(a), b(b) {};
private:
int a;
double b;
friend std::ostream& operator<<(std::ostream& os, A& rhs);
};
class memlist{
public:
memlist(int param1, double param2)
{
myint = new int(param1);
mydouble = new double(param2);
myclass = new A(param1,param2);
getMap["myint"] = myint;
getMap["mydouble"] = mydouble;
getMap["myclass"] = myclass;
}
~memlist()
{
delete myint;
delete mydouble;
delete myclass;
}
void* get(std::string param) {return getMap[param];};
private:
int *myint;
double *mydouble;
A *myclass;
std::map<std::string,void*> getMap;
};
std::ostream& operator<<(std::ostream& os, A& rhs){
os << rhs.a << std::endl << rhs.b;
return os;
};
int main(){
int myint = 5;
double mydbl = 3.14159263;
memlist mymem(myint,mydbl);
std::cout << *(int*)mymem.get("myint") << std::endl;
std::cout << *(double*)mymem.get("mydouble") << std::endl;
std::cout << *(A*)mymem.get("myclass") << std::endl;
*(int*)mymem.get("myint") = 10;
std::cout << *(int*)mymem.get("myint") << std::endl;
return 0;
}
輸出:
5
3.14159
5
3.14159
10
對於必須維護此代碼的程序員,我感到很遺憾。對於像這樣的事情,C++有'std :: any'。 – PaulMcKenzie
[std :: any usage](http://coliru.stacked-crooked.com/a/af4a1032226f6d60) – PaulMcKenzie
@PaulMcKenzie謝天謝地,這只是我玩指針而已... – charlestoncrabb