使用包装器类作为指向其包装的类型的指针

Using a wrapper class as a pointer to the type it wraps?

本文关键字:包装 类型 指针      更新时间:2023-10-16

我有一个用于Integer类型的简单包装类,定义如下:

class Integer {
    public:
        Integer() {
        }
        Integer(const int& value) {
            this->value = value;
        }
        int toInt() const {
            return value;
        }
        operator int() const {
            return toInt();
        }
    private:
        int value = 0;
};

我想做的是,将上面的类传递给一个具有如下签名的函数:doSomething(int* value)

如果我使用一个普通的int,我可以简单地做:

int value = 5;
doSomething(&value);

然而,当使用包装类时,我不能,因为它会使用指向类的指针,而不是实际的底层值。我知道地址运算符operator&,我可以使用它来返回指向该值的指针,但如果需要的话,它会阻止我获得指向类本身的指针。

因此,理想情况下,有一种方法可以让我使用&myclass来获得指向类或底层值的指针,具体取决于需要什么。

有这样的办法吗?

我似乎能够解决自己的问题。

我从@Arunmu的一条评论和以下问题中获得了一些灵感:https://stackoverflow.com/a/9569120

通过重载operator&()(的地址)运算符并返回一个代理类对象,该对象具有对原始类的类型及其包装的值的指针的隐式转换运算符,我可以使用所需的语法。

我将为任何遇到同样问题的人提供一个例子:

class IntegerPointer {
public:
    IntegerPointer(int& value, Integer& wrapper) : value(value), wrapper(wrapper) {
    }
    operator int*() {
        return &value;
    }
    operator Integer*() {
        return std::addressof(wrapper);
    }
private:
    int& value;
    Integer& wrapper;
};
class Integer {
public:
    Integer() {
    }
    Integer(const int& value) : value(value) {
    }
    Integer(const Integer& value) : Integer(value.value) {
    }
    IntegerPointer operator&() {
        return IntegerPointer(value, (*this));
    }
protected:
    int value;
};

这允许您使用语法,例如:

Integer test = 5;
doSomething(&test);

其中&test可以用作Integer对象的指针,也可以用作它包装的int值的指针。