2014-06-14 90 views
0

我想寫一個覆蓋給定類的某些功能的模板類。 一個簡單的例子是最好的形容什麼,我試圖做...C++運算符重載模板類

#include <iostream> 
using namespace std; 

class box{ 
public: 
    void print(){ cout << "Good!"; } 
}; 

template <class T> 
class shadow{ 
    T obj; 
public: 
    T& operator. (void) { return obj; } 
}; 

int main(void){ 
    shadow<box> t; 
    t.print(); 
} 

入住主要是我想做的事情。我想通過模板類來模擬 box'方法之一的調用。這似乎是運營商'。'不能被 重載。我設法達到這個最接近的是,運算符()超載 。

T& operator() (void) { return obj; } 

並在main中調用t().print()。你能否提出一個更好的方法去做我想做的事情? 在此先感謝。我真的不得不這樣做,我不想使用繼承。

+0

你想有效地實現什麼?聽起來像是我的XY問題。 –

+2

'operator .'不能被重載,但你可以重載'operator *',然後調用't-> print()'。 –

+2

你可以重載'shadow'的operator *'並像智能指針那樣使用't-> print()'語法。 – Csq

回答

6

一種選擇是超載T* operator->和/或T& operator*()

template <class T> 
class shadow{ 
    T obj; 
public: 
    T* operator->() { return &obj; } 
    const T* operator->() const { return &obj; } 
}; 

,我省略T& operator*()爲了簡潔,雖然它是有道理的兼得。然後使用它是這樣的:

int main() 
{ 
    shadow<box> t; 
    t->print(); 
} 

另外,提供了一個轉換操作符operator T&();,並通過t到功能與模板參數類型的參數:

template <class T> 
class shadow{ 
    T obj; 
public: 
    operator T&() { return obj; } 
    operator const T&() const { return obj; } 

void foo(const box& b) 
{ 
    b.print(); // Note: you need to make box::print() a const member function 
} 

int main() 
{ 
    shadow<box> t; 
    foo(t); 
} 
+0

謝謝,我喜歡第一個選項更多... 雖然不是我真正想到的,但並不差... –