gpt4 book ai didi

c++ - 模板重载(引用版和非引用版)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:01 26 4
gpt4 key购买 nike

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

想象一下下面的模板方法

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 编译器,你可以使用 (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() 的表达式,如下所示:

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

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

关于c++ - 模板重载(引用版和非引用版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38697362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com