使用包装类作为指向它包装类型的指针?

时间:2016-07-30 14:02:41

标签: c++ pointers wrapper

我有一个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获取指向类或基础值的指针,具体取决于所需的内容。

有这样的方法吗?

1 个答案:

答案 0 :(得分:2)

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

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

通过重载operator&()(address-of)运算符并返回一个代理类对象,它具有隐式转换运算符,指向我原始类的类型和它包装的值的指针,我可以使用语法I需要的。

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

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

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