2017-01-05 6 views
0

は、私が直面してる状況再現するいくつかのサンプルクラスです:C++関数の引数として任意のポインタここ

class A { 
B* seccond; 
} 
class B { 
int * number; 
} 
static NTSTATUS Read(std::uintptr_t address, size_t size, PVOID buff); 

// Let's assume we have object 'obj' which has valid address of number variable 

int buff; 
Read(obj.seccond, sizeof(int), &buff); 

Error: cannot convert argument 1 from 'int *' to 'uintptr_t' 

私はそれがで簡単に固定することができます知っている:

Read(std::uintptr_t(obj.seccond), sizeof(int), &buff); 

をしかし、これではありませんコードの読みやすさを低下させ、ちょうど醜いから十分満足です。私は本当にテンプレートを使用したくないのです。なぜなら、彼らはすでにどこにでもいるからです。 このような変数には単純なコンテナがありますか?それをやるよりエレガントな方法?

編集:私は再適応してきた質問、申し訳ありません

+2

'std :: uintptr_t'はポインタ型ではありません。整数です。暗黙の変換は多くの問題を引き起こします(例についてはCの歴史を見てください)。 – molbdnilo

+1

*テンプレートは既にあなたのコードのどこにでもあります* ...もう一度作る:) –

+0

私は知っていますが、私は他のプロセスのアドレス空間にポインタを保持しています。 'Read'関数に渡されるべきuint値です。だからこそ、その方法はありませんか? –

答えて

1

あなたは一箇所で変換を行うためにオーバーロードを使用する場合があります

static NTSTATUS Read(const void* p, size_t size, PVOID buff) 
{ 
    return Read(std::uintptr_t(p), size, buff); 
} 
+0

私はそれを試したと確信していた、問題の人とおかげで申し訳ありません! –

1

あなたはuintptr_tのためのあなたの機能待機ので、1 int*を使用しています。 署名されたものと署名されていないものがあります。あなたが行うことができ、後

class B { 
    int *number; 
    operator int*() { 
     return number; 
    } 
}; 

: あなたの問題を解決する方法は、そのようなことが考えられます。

ではなくintunsignedを使用するか、std::intptr_tの代わりstd::uintptr_t

EDITを使用しようとするようにしてください次のようなものがあります。 Read(*objA.second, ...);

Jarod42からの回答も良いです!

+0

私はおそらく間違って私の質問を尋ねた、あなたは今見てみることができますか? 問題は符号なし符号ではありませんが、メモリ内のオブジェクトのアドレスを保持するstd :: uintptr_tへの変換が必要です。 –

+0

私の編集を見て、@ Jarod42 :)の答えを見てください。 –

0

私はあなたがargument.For例として、ボイドポインタを使用することができたとします

static NTSTATUS Read(void* address, size_t size, PVOID buff); 

しかし、あなたはおそらく渡す必要がありますあなたがアドレス変数をキャストすべき型を決定するために、関数の他の引数。例えば、次のようになります。

static NTSTATUS Read(void* address,unsigned code, size_t size, PVOID buff) 
{ 
    //code could be int=1,float=2,... 
    switch(code) 
    { 
     //handle each case int,float,custom type ... 
     //by casting the address to the corresponding type(code) 
    } 
} 
関連する問題