2016-11-04 132 views
1

我有两个重载函数等C++重载函数

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

和两个重载函数g具有相同的原型作为f,但它们是简单封装到f,因此它们的实现是完全一样的:

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

有没有办法避免两次执行g?我知道这可以通过模板像

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

宣布g做,但后来我不得不请在函数调用的类型像

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

我信步什么的正确方法避免在不强制用户在每个函数调用中明确写入类型名的情况下写入g的执行两次?

+1

“但是我必须在函数中键入类型”,不,你不必。模板参数演绎为你做。 –

回答

4

“但是之后我必须在函数”中输入类型,不,你不需要。 模板论证扣除为您做到了。所以,函数模板是一个实用的解决方案。

你写的一个,

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

,例外的是它需要一个void返回类型的罚款。


可以支持移动的优化如下:

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

这里&&不表示右值引用,但所谓的通用参考,因为它适用于一个模板参数这已经可以作为参考。

这样做的效果是,std::forward在大多数情况下可以完全重现实际参数的种类,这就是所谓的完美转发

3

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

是的,有。

我知道这可以通过模板像

你去那里宣布G是完成。

但随后我会在函数调用

不,你没有输入的类型。你可以让编译器推导出类型:

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