2017-03-09 5 views
1

参照変数が通常の変数の代わりにクラスメンバーを参照しているかどうか(そしてそれが属するクラスを特定するかどうか)を判断する方法はありますか?C++:クラスメンバへの参照と通常の変数への参照を区別する方法はありますか?

class A 
{ 
    private: 
     unsigned int x; 

    public: 
     A() : x(15) { } 
     unsigned int& GetX() { return x; } 
}; 

int main(void) 
{ 
    A a; 
    unsigned int y = 12; 
    unsigned int& yr = y; 
    unsigned int& xr = a.GetX(); 

    // Is there anyway of identifying, using typeid() or something 
    // similar, whether xr refers to x inside class A or is its type 
    // completely indistinguishable from that of yr? i.e. does its type 
    // information contain anything along the lines of  
    // typeid(xr).name() == "A::unsigned int&" that identifies it as 
    // belonging to class A? 

    return 0; 
} 

EDIT:ここでうまくいけば私が取得していますかを示していることを簡単な例だ

はありませんので、区別する方法はありません。なぜあなたはしたいですか?疑問に思うように、XY問題のように聞こえます。

OK、多分私の例は単純すぎると多分私が右に質問をしていないよでしたので、私はあなたより詳細な例をあげてみましょう:

は、上記のクラスAを考えます。ほとんどの場合、getterメソッドを使用してxの値を照会し、定数参照を返すことが通常は必要です(実際のコードでは実際には非常に大きなベクトルまたは行列なので、値が返されるのが遅くなる可能性があります) 。しかし、いくつかの特殊なケースでは、xの値を変更できるようにしたい場合があります。つまり、前の質問のように関数ラッパーにバインドされているユーザー指定の関数の内部でC++: Generic function wrapper class as a member of a non-template classです。したがって、関数を関数ラッパーにバインドする場合、ユーザー関数によって変更される引数は、getterメソッドとヘルパークラスを使用して提供され、const修飾子を削除します。

class WriteAccess 
{ 
    public: 

     template <typename T> 
     static T& GetNonConstRef(const T& x) 
     { 
      return const_cast<T&>(x); 
     } 
}; 

そして、ユーザが指定した関数は次のようになります:

void UserFunc(unsigned int& X) 
{ 
    X = somethingelse; 
} 

しかし、私はあることからWriteAccess::GetNonConstRef()方法を阻止したいと思い、次のようにWriteAccessヘルパークラスがある

A.BindFunc(UserFunc, WriteAccess::GetNonConstRef(A.GetX())); 

古いクラスメンバと一緒に使用され、クラスA(および派生クラス)のメンバでのみ使用できるようにします。とにかく、WriteAccess::GetNonConstRef()の内部で、どのクラスが提供されている参照に属しているかを調べて、それがコンパイルされていないか、別のクラスが使用されている場合は実行が終了するかどうかを確認したいと思っていました。

普通の変数への参照とクラスメンバーの参照(実際にはクラスAのメンバーへの参照と他のクラスのメンバーへの参照)を区別するための方法がある場合は、これが役に立ちます。

+6

いいえ、そう区別する方法はありません。なぜあなたはしたいですか?疑わしいように[XY問題](http://xyproblem.info/)のように聞こえます。 –

+0

'int&A :: GetX()'を追加する方が簡単です... – Jarod42

+0

ところで、 'const int&ref = cond? y:a.GetX(); ' – Jarod42

答えて

3

クラスメンバーへの参照と通常の変数への参照を区別する方法はありますか?

一般に、これは不可能です。参照にはオブジェクトコンテナの情報は保持されません。サブオブジェクトはスタンドアローンオブジェクトと区別できません。

typeidは役に立ちません。変数の完全修飾名は、変数の型名の一部ではありません。


しかし、参照(またはポインタ)が特定のコンテナインスタンスの特定のメンバーを指すかどうかをテストすることが可能である:

bool xr_refers_to_x_of_a = &xr == &a.GetX(); // true 
関連する問題