アクセス可能な(ただし編集可能ではない)データメンバが混在しているクラスに対して、単一のget関数を記述することができます。次のコードに見られるように、メンバーのアドレスのvoid * -castコピーを保持するマップの使用はうまくいくが、 'const'が読み込み専用を強制するためにミックスに投入されるとすぐに、 'const void *'型は、データメンバーに適切にアクセスするために再作成できません。次のコードは、混合データ型のクラスに対して単一のget関数を記述するために機能しますが、すべてのデータメンバーをget関数でアクセスするようにしています(具体的には、クラスの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