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

C++: How to distinguish between a reference to a class member and a reference to an ordinary variable?

本文关键字:引用 变量 何区 成员      更新时间:2023-10-16

是否有任何可能的方法来确定参考变量是否是指类成员(然后确定其属于哪个类)而不是普通变量?这是一个简单的示例,希望显示我的收入:

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;
}

编辑:

不,没有办法这样区分。你为什么要?听起来 可疑地像XY问题。

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

考虑上述A类。在大多数情况下,我想使用getter方法来查询x的值,因此返回常数引用通常是需要的(在我的真实代码中,x实际上是一个很大的向量或矩阵,因此按值返回可能会很慢)。但是在某些特殊情况下,我可能希望能够根据以前的问题更改x-的值 - 即用户指定函数内部的函数包装器的函数:C :通用函数包装程序类作为非非非函数的成员 - 模板类。因此,当将函数绑定到功能包装器时,用户函数将使用getter方法和辅助类别删除const限定器的参数,例如。

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

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()方法与任何旧类成员一起使用,并且仅允许它与A类(和派生类)一起使用。因此,我想知道是否可以确定WriteAccess::GetNonConstRef()内的哪个类别的参考属于哪个类,以便如果使用其他类,则不会编译或执行。

因此,我在想是否有某种方法可以区分对普通变量的参考和班级成员的参考(确实是对A类成员的引用以及对其他班级成员的引用),那么这可能会对我有所帮助。

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

通常,这是不可能的。引用不包含对象容器的信息。子对象与独立对象没有区别。

typeid不会有任何帮助。变量的完全合格名称不是变量的类型名称的一部分。


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

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