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