c ++重载函数具有相同的实现

时间:2016-11-04 08:46:32

标签: c++ overloading

我有两个重载函数,比如

void f(int);
void f(std::string);

两个重载函数g具有与f相同的原型,但它们是f的简单包装器,因此它们的实现完全相同:

void g(int n) { f(n);}
void g(std::string n) { f(n); } 

有没有办法避免写两次g的实施?我知道这可以通过像{/ p>这样的模板声明g来完成

template<typename T> g(T n) { f(n);}

然后我必须在函数调用中键入类型,如

g<int>(2);
g<std::string>("42");

我想避免在不强制用户在每个函数调用中显式写入typename的情况下避免编写两次g实现的正确方法吗?

2 个答案:

答案 0 :(得分:4)

“但是我必须在函数中输入类型”,不,你没必要。 模板参数演绎为您做到这一点。因此,功能模板是一种实用的解决方案。

你写的那个,

template<typename T> g(T n) { f(n);}

很好,只需要void返回类型。

您可以按如下方式支持移动优化

template< class Arg >
void g( Arg&& arg ) { f( std::forward<Arg>( arg ) ); }

此处&&不表示右值引用,而是表示所谓的通用引用,因为它已应用于已经可以作为引用的模板参数。

这样做的结果是std::forward在大多数情况下可以完全重现实际参数的类型,称为完美转发

答案 1 :(得分:3)

  

有没有办法避免写两次执行g?

是的,有。

  

我知道这可以通过像

这样的模板声明g来完成

你去。

  

但是我必须在函数调用中输入类型

不,你没有。您可以让编译器推断出类型:

g(2);
g("42");