2010-10-12 130 views
3

假設我有任意的模板的方法,其可以通過常引用(顯然因此,用於瑣碎類型和對象)接收參數由值模板參數++

編寫模板函數原型時如何處理這種情況?

我能做出這樣的:

template <typename T> void Foo(T value) { 
    // Do something. 
} 

template <typename T> void Foo(const T& value) { 
    // Do something, yeah. 
} 

// Specialization for first prototype. 
template <> void Foo<int>(int value) { } 

// Specialization for second prototype. 
template <> void Foo<Object>(const Object& value) { } 

但這種方法只適用於瑣碎的功能,即充當純粹至於其它的一些調用的封裝好。

如果函數(非模板版本)裏面有很多代碼,這意味着我必須複製代碼兩次。

我可以在這裏做些更聰明的事嗎?

回答

7

只是採用const引用ALWAYS,因爲在傳遞基元類型作爲const引用時沒有太多開銷。

+0

有一個疑問。如果我有像void foo(const complex&obj1)這樣的東西,並且我將它稱爲foo(2),會發生什麼? (假設我有int類型的複製構造函數。) – 2010-10-12 14:28:01

+1

@Manoj:然後創建一個臨時的'complex'對象(用'2'初始化)並傳遞給函數。這個臨時的直到包含函數調用的表達式結束。 – 2010-10-12 14:31:49

+1

@Manoj:與非常量引用不同,const引用可以綁定到右值,所以不用擔心 – 2010-10-12 14:39:11

5

僅爲const引用編寫模板代碼,並依靠編譯器優化引用。