模板重载(参考版和非参考版)

Template overloading (reference and non reference version)

我有一个看似简单的问题,但我不知道如何解决。

想象一下下面的模板方法

template<typename T> void Add(T& var);

专业化可以向容器中添加一些东西(某种程度上)。我可以传入 POD 或更复杂的类型,例如 strings,这就是我将 T 作为参考传递的原因。

这个问题是每当我想用另一种方法的结果调用 Add(...) 时,例如:

Add(MethodThatReturnsAnInt());

这行不通,需要一个临时变量来保存 MethodThatReturnsAnInt() 的结果。

有什么方法可以重载 Add 以便我可以有引用传递和非引用传递版本吗?

template<typename T> void Add(T& var);
template<typename T> void Add(T var);

std::enable_if在这种情况下有用吗?

如果您的编译器尚不支持 C++11,您将需要更新您的编译器,然后使用转发引用,&&

如果你有 C++11 编译器,你可以使用 (Universal Reference) 转发参考:

template<typename T> void Add(T&& var) {}

int MethodThatReturnsAnInt() { return 42; }

int main()
{
    int a = MethodThatReturnsAnInt();

    Add(a);                        // lvalue passed: void Add(int& var) takes lvalue reference  
    Add(MethodThatReturnsAnInt()); // rvalue passed: void Add(int&& var) takes rvalue reference  
}

T&& 在此示例中不是 右值引用。在类型推导上下文中,T&& 具有特殊含义。 T 取决于传递给函数 Add() 的表达式,如下所示:

  • 如果表达式是左值(例如:a)类型E,那么T被推导为E&.

  • 如果表达式是 rvalue(例如:函数返回的值)E,则 T 推导为 Evar 将具有类型 E&&.