我想在2个接口上使用相同的功能,因为两个实现是相同的,并且在2个重载签名中实现了相同的功能,这真的不是我想要的。
#include <iostream>
#include <vector>
template <typename T>
void foo(T&) {} // I have to write the same things here ...
template <typename T>
void foo(T) {} // ... and here
int main() {
foo(std::vector<int>()); // call only for T
std::vector<int> v;
foo(v); // ambiguos call but I only need 1 implementation
return (0);
}
基本上我想解决这种情况并将2个模板化函数融合为1。
我不知道,因为主要问题是保持相同的实现,而不仅仅是重载签名或删除模板的使用。
答案 0 :(得分:1)
为什么不使用rvalues
?
正如interjay所说:它是一个_ 通用引用 _,它可以是_ 右值引用 _或_ 左值引用< / EM> _ 强>
#include <iostream>
#include <vector>
template <typename T>
void foo(T&&) {}
// ^^
int main() {
foo(std::vector<int>());
std::vector<int> v;
foo(v);
return (0);
}
rvalues
将允许引用临时对象和普通对象。
rvalue (所谓的,历史上,因为rvalues可能出现在赋值表达式的右侧)是一个对象,通常接近其生命周期的末尾,一个临时对象或其子对象,或与对象无关的值。
编辑:
您也可以使用const T&
,但不允许您修改对象:
template <typename T>
void foo( T&& v )
{
v.push_back( 1 ); // good...
}
template <typename T>
void foo2( const T& v )
{
v.push_back( 1 ); // ILLEGAL...
}
如果您根本不需要修改对象,我建议您使用最后一个解决方案。