模板重载(参考版和非参考版)
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 推导为 E
和 var
将具有类型 E&&
.
我有一个看似简单的问题,但我不知道如何解决。
想象一下下面的模板方法
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 推导为E
和var
将具有类型E&&
.