我有一个用于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来获取指向类或基础值的指针,这取决于所需的内容。
有没有这样的办法?
发布于 2016-07-31 06:20:21
看起来我能够解决我自己的问题。
我从@Arunmu的评论和下面的问题中获得了一些灵感:https://stackoverflow.com/a/9569120
通过重载operator&() (address- of )操作符并返回一个代理类对象,该对象具有隐式转换操作符,指向我的原始类的类型和它包装的值的指针,我可以使用所需的语法。
我将为遇到同样问题的任何人提供一个示例:
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值的指针。
https://stackoverflow.com/questions/38674776
复制相似问题