重载模板函数

时间:2012-02-28 15:04:13

标签: c++ overloading

我怀疑这种方法是否可行,假设你想要两种方法同时调用一个函数,一种是返回一个对象而另一种是通过引用返回参数:

// ...  
template <class T> void func(Foo<T>& f, const T n) 
{ 
    f.a = Something(f.a + n); 
    f.b = Something(f.b + n); 
}

template <class T> Foo<T> func(const Foo<T>& f, const T n) 
{ 
    return Foo<T>( Something(f.a + n), Something(f.b + n) ); 
}
// ...


// main
Foo<int> foo(1, 1);

func(foo, 2);
Foo<int> foo2 = func(foo, 2);

第一个参数中的const字是否会影响方法的签名?

2 个答案:

答案 0 :(得分:5)

是的。 const会影响签名,返回类型则不会。

1.3.11签名

  

有关参与重载的函数的信息   resolution(13.3):它的参数类型列表(8.3.5),如果是   function是一个类成员,函数上的cv-qualifiers(如果有的话)   本身和声明成员函数的类。 [...]

const是hte parameter-type-list的一部分,因此它确定了一个重载。

答案 1 :(得分:3)

是的,对const的引用是对非const的引用的单独类型,因此带有这些参数的两个函数是单独的重载。

然而,这不起作用:

Foo<int> foo2 = func(foo, 2);

由于foo不是const,这将选择非const重载,它没有返回值;所以作业将失败。您需要明确选择const版本:

Foo<int> foo2 = func(static_cast<const Foo<T>&>(foo), 2);