我有两个重载函数,比如
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
实现的正确方法吗?
答案 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");