2016-07-30 187 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值的指針。