C ++:如何区分对类成员的引用和对普通变量的引用?

时间:2017-03-09 17:39:01

标签: c++ c++11 rtti typetraits typeinfo

是否有任何可能的方法来确定引用变量是否引用类成员(然后确定它属于哪个类)而不是普通变量?这是一个简单的例子,希望能够展示我的目标:

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

修改

  

不,没有办法区分。你为什么想要?声音   可疑地喜欢XY问题。

好吧,也许我的例子太简单了,也许我没有问正确的问题,所以让我给你一个更详细的例子:

考虑上面的A类。在大多数情况下,我想使用getter方法来查询x的值,因此返回常量引用通常是需要的(在我的实际代码中,x实际上是一个非常大的向量或矩阵,因此按值返回可能很慢) 。但在某些特殊情况下,我可能希望能够更改x的值 - 即根据前一个问题绑定到函数包装器的用户指定函数内部:C++: Generic function wrapper class as a member of a non-template class。因此,在将函数绑定到函数包装器时,将使用getter方法和辅助类来提供将由用户函数修改的参数,以删除const限定符,例如。

WriteAccess

其中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::GetNonConstRef()方法与任何旧类成员一起使用,并且只允许它与类A(和派生类)的成员一起使用。所以我想知道是否还有在position: fixed;内确定所提供的引用属于哪个类,以便它不编译或者如果使用不同的类则终止执行。

所以我在想是否有某种方法可以区分对普通变量的引用和类成员的引用(实际上引用了类A的成员和对其他类成员的引用),那么这可能对我有帮助。

1 个答案:

答案 0 :(得分:3)

  

如何区分对类成员的引用和对普通变量的引用?

一般来说,这是不可能的。引用不包含对象容器的信息。子对象与独立对象无法区分。

typeid没有任何帮助。变量的完全限定名称不是变量类型名称的一部分。

但是,可以测试引用(或指针)是否引用特定容器实例的特定成员:

bool xr_refers_to_x_of_a = &xr == &a.GetX(); // true