重载模板化函数

Overloading templated functions

本文关键字:函数 重载      更新时间:2023-10-16

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

// ...  
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会影响签名,而返回类型不会。

1.3.11签名

有关参与过载的函数的信息分辨率(13.3):其参数类型列表(8.3.5),如果函数是类成员,函数上的cv限定符(如果有的话)它本身和在其中声明成员函数的类。[…]

const是参数类型列表的一部分,因此它确实确定了重载。

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

然而,这将不起作用:

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

由于foo不是const,这将选择无返回值的非const过载;因此分配将失败。您需要明确选择const版本:

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