2016-07-30 85 views
0

我有整型一个简单的包装类,像这样定义的:使用包装类作为它包装类型的指针?

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

你为什么要实现这样的类?这是[xy问题](http://xyproblem.info/)? – Xiobiq

+3

你可以重载'&',但是为了得到这个类的地址,你将不得不使用'std :: addressof'。也就是说,你正在做的是反对一个好的设计。 – Arunmu

+0

@Polikdir我已经实现了这个类,以便我可以在跨平台的内存中实施一个常量整数大小。 – Qub1

回答

1

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

我把从@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); 

哪里&测试可以作为一个指针Integer对象或作为指向其包装的int值的指针。