2011-10-14 53 views
0

在我的代碼,我有一個函數:更換模板函數foo(T *)由富(T)

template<typename T> 
void foo (T*); // make sure that 'foo()' is passed only pointers 
在新的實施

現在,我也通過一個智能指針(像shared_ptr<>所以我已經改變了簽名功能的,

template<typename T> 
void foo (T); // pointers or smart-pointers 

代碼應很好地工作。但是,有沒有什麼副作用,我失蹤?

+1

這些不是模板函數... –

回答

0

無效美孚(T)是傳遞的副本。如果sizeof(T)非小,則3210 T &(通過引用傳遞)會更有效。

+1

...但對於其中'T'只是一個指針的情況完全沒用。而且大多數智能指針不會在指針外面保存大量數據。 (根據智能指針類型,它可能不包含任何內容,所有額外的信息都將被存儲在指向對象的旁邊)。如果要這樣做,請使用'const T&',否則可能會最終有一些有趣的副作用。 –

1

如果需要,您可以使用enable_if僅允許指針或shared_ptr的實例進行編譯。這樣你就可以恢復以前的編譯時檢查(不過,大概你的函數實現也會這樣做)。

+0

請注意,對於您未知的任何類型的智能指針,此機制都會失敗。所以可擴展性是有限的。 –

+0

除非你要創建一個is_pointer_type特性......該死的,Boost中沒有一個 - 它說要創建你自己的!懶惰的助推器:-( – Ayjay

相關問題