首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用包装器类作为指向它包装的类型的指针?

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

Stack Overflow用户
提问于 2016-07-30 22:02:41
回答 1查看 619关注 0票数 1

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

代码语言:javascript
复制
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,我可以简单地这样做:

代码语言:javascript
复制
int value = 5;
doSomething(&value);

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

因此,理想情况下,会有一种方法允许我使用&myclass来获取指向类或基础值的指针,这取决于所需的内容。

有没有这样的办法?

EN

回答 1

Stack Overflow用户

发布于 2016-07-31 06:20:21

看起来我能够解决我自己的问题。

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

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

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

代码语言:javascript
复制
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;
};

这使您可以使用以下语法:

代码语言:javascript
复制
Integer test = 5;
doSomething(&test);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38674776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档