2016-08-11 3 views
1

Предположим, у меня есть класс, как так (Обратите внимание, что это моделируется после Method Wrapper по Страуструпом:Автоматическое преобразование типа

template<class T> 
struct Wrapper 
{ 

    private: 

    //This class is implicitly convertable to T& 
    struct TempRef 
    { 
    operator T&(); 
    T& operator()(); 
    ~TempRef(); //Executes clean up code 
    }; 
    struct TempPtr 
    { 
    T* operator T->(); 
    ~TempPtr(); //Executes clean up code 
    }; 

    public: 
    TempRef operator*(); 
    TempPtr operator->(); 

}; 

Цель этого класса для того, чтобы действовать как указатель на T:

И это работает в некоторых случаях:

Wrapper<thing> var; 
var->foo(); 

проблема возникает, когда я хочу, чтобы использовать его в качестве обертки для интегрального типа:

Wrapper<int> var; 
//*var = 12; //Oops!! Does not work (no automatic conversion) 
((int&)(*var)) = 12; //Works but the syntax is a pain 
(*var)() = 12; //Good but still could be better 

Таким образом, вопрос заключается в следующем:

Есть ли способ, чтобы сделать синтаксис для использования Wrapper в качестве оболочки для интегрального типа таких же, как указатель на целочисленный тип, или это просто невозможно в данный момент?

+0

Это не работает лучше для указателя. Вы тестируете две разные вещи. Попробуйте назначить обернутый указатель. – chris

ответ

1

Вам необходимо определить оператор присваивания в Wrapper. Что-то вроде

Wrapper<T> &operator=(const T &v) { 
    /*something to get the T& returned by TempRef::operator T&*/ = v; 
    return *this; 
} 

это будет затем вызывается var = 12;.

+0

Да .... это прекрасно ...... Просто нужно сделать один для всех других операторов, а затем он будет работать отлично ... Конечно, только с включенным, если T имеет такую ​​операцию. ..... – DarthRubik

Смежные вопросы