2010-10-12 115 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引用编写模板代码,并依靠编译器优化引用。