模板T和T&在同样的实施下

时间:2013-07-23 09:01:52

标签: c++ templates c++11

我想在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。

我不知道,因为主要问题是保持相同的实现,而不仅仅是重载签名或删除模板的使用。

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...
}

如果您根本不需要修改对象,我建议您使用最后一个解决方案。