2016-07-30 174 views
2

我有作用於型clazz和它們之間的唯一區別的對象兩個功能是我訪問他們的成員的方式:函數參數:矢量<Clazz*>&VS矢量<Clazz>&

void foo(vector<Clazz*>& v) { 
    ... 
    v[0]->method(); 
    ... 
} 

void foo(vector<Clazz>& v) { 
    ... 
    v[0].method(); 
    ... 
} 

這是不可能的/實際上可以將不使用v的代碼外包並編寫一個簡單的包裝函數。我可以在一個循環中簡單地將一個矢量類型轉換爲另一個矢量類型,並將新矢量傳遞給該函數的一個標準化版本,但我需要一個支持這兩種變體的快速解決方案。

是否有合併兩個函數的方法,仍然保留兩種輸入類型的靈活性?

回答

4

是的。這是一個模板功能。

你將不得不以某種方式抽象出「你訪問他們的成員的方式」。也許通過一個額外的模板lambda參數提供訪問成員的抽象手段。或者,也許是通過幫手過載。

Clazz &gimme(Clazz &c) { return c; } 

Clazz &gimme(Clazz *c) { return *c; } 

然後,讓你的模板函數:

template<typename vector_t> void foo(vector_t & v) 

...叫gimme(v[n])訪問每個成員的載體。